我正在做一些文本分析,并且有一个看起来像这样的数据
**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
和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)?它可能吗?
如果没有,我有什么替代品?如同,哪个结构最接近我想要的那个。
答案 0 :(得分:2)
您可以将cumcount
用于新列,然后使用set_index
unstack
重新整形,最后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
答案 1 :(得分:2)
df.set_index(
['C2', 'C3', df.groupby('C2').cumcount() + 1]
).C1.unstack().rename(columns='CT{}'.format)
CT1 CT2 CT3
C2 C3
TEXT1 ANOTHER_TEXT1 A1 A2 None
TEXT2 ANOTHER_TEXT1 B1 B2 B3
TEXT3 ANOTHER_TEXT2 D1 D2 None
添加reset_index
以获得您想要的内容
df.set_index(
['C2', 'C3', df.groupby('C2').cumcount() + 1]
).C1.unstack().rename(columns='CT{}'.format).reset_index()
C2 C3 CT1 CT2 CT3
0 TEXT1 ANOTHER_TEXT1 A1 A2 None
1 TEXT2 ANOTHER_TEXT1 B1 B2 B3
2 TEXT3 ANOTHER_TEXT2 D1 D2 None