python-3.x Pandas:如何根据列值将一个大df拆分为多个df

j91ykkif  于 2023-02-10  发布在  Python
关注(0)|答案(2)|浏览(410)

我想知道是否有一种方法可以使用第一列中的周期性(例如,介于~5,...,~0之间)将下表分为多个子DFS

before:   

a        b        c
5.10    1.00    0.00
4.20    2.00    0.00
3.01    3.00    0.00
2.10    4.00    0.00
1.20    5.00    0.00
0.52    6.00    0.00
0.02    6.00    1.00
5.30    7.00    0.40
4.20    8.00    0.00
3.10    9.00    0.00
2.40    10.00   0.00
1.30    11.00   0.00
0.20    12.00   0.00
5.98    13.00   0.00
4.23    14.00   0.30
3.33    15.00   0.00
2.11    16.00   0.00
1.30    17.00   0.00
0.30    18.00   0.00
5.50    13.00   0.00

output after separating into multiple dfs :

"sub_df1"
5.10    1.00    0.00
4.20    2.00    0.00
3.01    3.00    0.00
2.10    4.00    0.00
1.20    5.00    0.00
0.52    6.00    0.00
0.02    6.00    0.00

"sub_df2"
5.30    7.00    0.00
4.20    8.00    0.00
3.10    9.00    0.00
2.40    10.00   0.00
1.30    11.00   0.00
0.20    12.00   0.00

"sub_df3"
5.98    13.00   0.00
4.23    14.00   0.00
3.33    15.00   0.00
2.11    16.00   0.00
1.30    17.00   0.00
0.30    18.00   0.00

"sub_df4"
5.50    13.00   0.00

周期的长度是可变的,所以我不能假设一个固定的长度来分隔。因此,我首先考虑添加另一个列'id',如

df['id']=(df['a'].shift(1)>df['a']).astype(int)

这至少可以显示从何处(1st:“0”)到何处(2nd“0”)追加值。但是,我不太知道如何从这里继续

a     b    c     id
0   4.20   2.0  0.0   0
1   3.01   3.0  0.0   1
2   2.10   4.0  0.0   1
3   1.20   5.0  0.0   1
4   0.52   6.0  0.0   1
5   0.02   6.0  1.0   1
6   5.30   7.0  0.4   0
7   4.20   8.0  0.0   1
8   3.10   9.0  0.0   1
9   2.40  10.0  0.0   1
10  1.30  11.0  0.0   1
11  0.20  12.0  0.0   1
12  5.98  13.0  0.0   0
13  4.23  14.0  0.3   1
14  3.33  15.0  0.0   1
15  2.11  16.0  0.0   1
16  1.30  17.0  0.0   1
17  0.30  18.0  0.0   1
18  5.50  13.0  0.0   0
j9per5c4

j9per5c41#

您可以创建一个系列s来标识不同的组。从那里,您可以创建多个 Dataframe ,并将添加到 Dataframe df_dict的字典中。我将向您展示如何在print语句中访问这些 Dataframe 。

s = (df['a'] > df['a'].shift()).cumsum() + 1
df_dict = {}
for frame, data in df.groupby(s):
    df_dict[f'df{frame}'] = data

print(df_dict['df1'], '\n\n', 
      df_dict['df2'], '\n\n',
      df_dict['df3'], '\n\n',
      df_dict['df4'])
      a    b    c
0  5.10  1.0  0.0
1  4.20  2.0  0.0
2  3.01  3.0  0.0
3  2.10  4.0  0.0
4  1.20  5.0  0.0
5  0.52  6.0  0.0
6  0.02  6.0  1.0 

       a     b    c
7   5.3   7.0  0.4
8   4.2   8.0  0.0
9   3.1   9.0  0.0
10  2.4  10.0  0.0
11  1.3  11.0  0.0
12  0.2  12.0  0.0 

        a     b    c
13  5.98  13.0  0.0
14  4.23  14.0  0.3
15  3.33  15.0  0.0
16  2.11  16.0  0.0
17  1.30  17.0  0.0
18  0.30  18.0  0.0 

       a     b    c
19  5.5  13.0  0.0
uhry853o

uhry853o2#

试试这个:

listofdfs = [y for x,y in df.groupby(df['a'].diff().gt(0).cumsum())]

dict(list(df.groupby(df['a'].diff().gt(0).cumsum())))

相关问题