我正在做一些文本分析,并且有一个看起来像这样的数据
**TABLE 1**
C1 C2 C3
A1 TEXT1 ANOTHER_TEXT1
A2 TEXT1 ANOTHER_TEXT1
B1 TEXT2 ANOTHER_TEXT1
B2 TEXT2 ANOTHER_TEXT1
B3 TEXT2 ANOTHER_TEXT1
D1 TEXT3 ANOTHER_TEXT2
D2 TEXT3 ANOTHER_TEXT2
我真正需要的是一个数据集,汇总C2
,以及内容C1
作为不同的列。本质上,什么是df.transpose
应该做的。
但问题是,如果我转置,它不会聚合C2
and C3
.
本质上,这就是我正在查看的结构
**TABLE 2**
C1 C2 CT1 CT2 CT3
ANOTHER_TEXT1 TEXT1 A1 A2 NA
ANOTHER_TEXT1 TEXT2 B1 B2 B3
ANOTHER_TEXT2 TEXT3 D1 D2 NA
我在尝试df.pivot_table(index=['C2','C3'], aggfunc='count')
,它给出了出现次数,这是正确的(如下所示)。
**TABLE 3**
C1 C2 CT1
ANOTHER_TEXT1 TEXT1 2
TEXT2 3
ANOTHER_TEXT2 TEXT3 2
那么,我如何得到我想要的结构(表2)?这有可能吗?
如果没有,我还有什么选择?比如,哪种结构最接近我想要的结构。
您可以使用cumcount对于新列,然后重塑set_index with unstack, last add_prefix:
df['g'] = df.groupby(['C2','C3']).cumcount() + 1
df = df.set_index(['C2','C3', 'g'])['C1'].unstack().add_prefix('CT').reset_index()
print (df)
C2 C3 CT1 CT2 CT3
0 TEXT1 ANOTHER_TEXT1 A1 A5 A2
1 TEXT2 ANOTHER_TEXT1 B1 B2 B3
2 TEXT3 ANOTHER_TEXT2 D1 D2 None
另一种解决方案是groupby
,对于新列使用Series
构造函数:
df = df.groupby(['C2','C3'])['C1'] \
.apply(lambda x: pd.Series(x.values)) \
.unstack() \
.rename(columns=lambda x: 'CT{}'.format(x+1)) \
.reset_index()
print (df)
C2 C3 CT1 CT2 CT3
0 TEXT1 ANOTHER_TEXT1 A1 A5 A2
1 TEXT2 ANOTHER_TEXT1 B1 B2 B3
2 TEXT3 ANOTHER_TEXT2 D1 D2 None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)