根据变量的当前出现对行进行分组

时间:2019-08-15 05:43:06

标签: python-3.x pandas pandas-groupby

我正在尝试根据出现的变量对数据框进行分组。例如以这个数据框

   | col_1 | col_2
---------------------
 0 | 1     | 1
 1 | 0     | 1
 2 | 0     | 1
 3 | 0     | -1
 4 | 0     | -1
 5 | 0     | -1
 6 | 0     | NaN
 7 | -1    | NaN
 8 | 0     | NaN
 9 | 0     | -1
 10| 0     | -1
 11| 0     | -1

我想根据column_2中当前出现的变量将变量分组到一个数据帧中,并将下一个序列放入另一个数据帧中,直到数据帧的末尾,同时也忽略NaN。

所以最终输出将是: 一个_1 =

   | col_1 | col_2
---------------------
 0 | 1     | 1
 1 | 0     | 1
 2 | 0     | 1

mones_1 =

 3 | 0     | -1
 4 | 0     | -1
 5 | 0     | -1

mones_2 =

 9 | 0     | -1
 10| 0     | -1
 11| 0     | -1

2 个答案:

答案 0 :(得分:1)

我建议创建DataFrames字典:

#only non missing rows
mask = df['col_2'].notna()
#create unique groups
g = df['col_2'].ne(df['col_2'].shift()).cumsum()
#create counter of filtered g
g = g[mask].groupby(df['col_2']).transform(lambda x:pd.factorize(x)[0]) + 1
#map positive and negative values to strings and add counter values
g = df.loc[mask, 'col_2'].map({-1:'mones_',1:'ones_'}) + g.astype(str)
#generally groups
#g = 'val' + df.loc[mask, 'col_2'].astype(str) + ' no' + g.astype(str)
print (g)
0      ones_1
1      ones_1
2      ones_1
3     mones_1
4     mones_1
5     mones_1
9     mones_2
10    mones_2
11    mones_2
Name: col_2, dtype: object

#create dictionary of DataFrames
dfs = dict(tuple(df.groupby(g)))
print (dfs)
{'mones_1':    col_1  col_2
3      0   -1.0
4      0   -1.0
5      0   -1.0, 'mones_2':     col_1  col_2
9       0   -1.0
10      0   -1.0
11      0   -1.0, 'ones_1':    col_1  col_2
0      1    1.0
1      0    1.0
2      0    1.0}

#select by keys
print (dfs['ones_1'])
   col_1  col_2
0      1    1.0
1      0    1.0
2      0    1.0

它不是recommended,但可能通过具有变量名称的组来创建DataFrame:

for i, g in df.groupby(g):
    globals()[i] =  g

print (ones_1)
   col_1  col_2
0      1    1.0
1      0    1.0
2      0    1.0

答案 1 :(得分:1)

这是另一种逻辑(再次将其保存在字典中):

m=df[df.col_2.notna()] #filter out the NaN rows
#check if the index are in sequence along with that check if values changes per row
s=m.col_2.ne(m.col_2.shift())|m.index.to_series().diff().fillna(1).gt(1)
dfs={f'df_{int(i)}':g for i , g in df.groupby(s.cumsum())} #groupby and store in dict

通过访问键访问数据框:

print(dfs['df_1'])
print('---------------------------------')
print(dfs['df_2'])
print('---------------------------------')
print(dfs['df_3'])

   col_1  col_2
0      1    1.0
1      0    1.0
2      0    1.0
---------------------------------
   col_1  col_2
3      0   -1.0
4      0   -1.0
5      0   -1.0
---------------------------------
    col_1  col_2
9       0   -1.0
10      0   -1.0
11      0   -1.0