[英]grouping or merging? dataframes pandas python
关于对熊猫进行分组的另一个问题。 目前,我在以下代码中使用合并功能和堆栈功能对它们进行分组:
import pandas as pd, numpy as np
df = pd.DataFrame({'Type' : ['SS', 'SS', 'SS', 'DD', 'DD', 'FF'],
'No.' : ['323', '12', '21', '334', '44', '55'],
'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS', 'SS', 'TT', 'DD', 'FF'],
'No.' : ['43', '77', '98', '352', '51'],
'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')
Merged=concat([df,df2], axis=0, keys=['Sample1','Sample2']).stack()
print Merged
Type
Sample1 SS No. 323
Res O
No. 12
Res E
No. 21
Res O
DD No. 334
Res E
No. 44
Res E
FF No. 55
Res O
Sample2 SS No. 43
Res O
No. 77
Res O
TT No. 98
Res E
DD No. 352
Res E
FF No. 51
Res O
有没有一种分组方法,所以我可以得到类似于以下结果的结果:
Sample1 Sample 2
No. Res No. Res
Type
SS 323 O 43 O
12 E 77 O
21 O
DD 334 E 352 E
44 E
FF 55 O 51 O
TT 98 E
您尝试的几乎是正确的,您只需要在concat
设置axis=1
(并且不需要堆栈)。 但是数据框的问题是您有一个非唯一索引 ,因此concat
无法知道如何沿该轴连接两个数据框(例如,有多个“ SS”)。
一种方法是,例如,将第二级添加到索引以使其唯一(仅适用于pandas 0.13,有关旧版本的解决方法,请参见下文):
df['count'] = df.groupby(df.index).cumcount()
df2['count'] = df2.groupby(df2.index).cumcount()
df = df.set_index('count', append=True)
df2 = df2.set_index('count', append=True)
因此,数据框如下所示:
In [64]: df
Out[64]:
No. Res
Type count
SS 0 323 O
1 12 E
2 21 O
DD 0 334 E
1 44 E
FF 0 55 O
然后,您只需将axis=1
和提供的keys
:
In [65]: pd.concat([df,df2], axis=1, keys=['Sample1','Sample2'])
Out[65]:
Sample1 Sample2
No. Res No. Res
Type count
DD 0 334 E 352 E
1 44 E NaN NaN
FF 0 55 O 51 O
SS 0 323 O 43 O
1 12 E 77 O
2 21 O NaN NaN
TT 0 NaN NaN 98 E
您始终可以使用merged.index = merged.index.droplevel(1)
再次删除count
。
但是,当然,这是否是一个好的解决方案取决于您数据的性质以及您想要进一步处理的数据。
注意: cumcount
是一种新方法,仅适用于master(将于0.13版中发布),目前您可以使用以下方法实现此目的:
df = df.reset_index()
df['count'] = df.groupby('Type').apply(lambda x : pd.Series(np.arange(len(x)), x.index))
df.set_index(['Type', 'count'])
您需要使用列multiindex来获取所需格式的数据:
import pandas as pd, numpy as np
df = pd.DataFrame({'Type' : ['SS1', 'SS2', 'SS3', 'DD1', 'DD2', 'FF1'],
'No.' : ['323', '12', '21', '334', '44', '55'],
'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS1', 'SS2', 'TT1', 'DD1', 'FF1'],
'No.' : ['43', '77', '98', '352', '51'],
'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')
#Add multi index to the two dataframes
df.columns = [["Season 1"]*2, list(df.columns)]
df2.columns = [["Season 2"]*2, list(df2.columns)]
#Join on their row index
df.join(df2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.