Python中的Pivot和Transpose的组合

时间:2017-04-10 08:34:17

标签: python-2.7 pandas

我正在做一些文本分析,并且有一个看起来像这样的数据

**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应该做什么。 但问题是,如果我进行转置,则不会汇总C2C3

基本上,这是我正在研究的结构

**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)?它可能吗?

如果没有,我有什么替代品?如同,哪个结构最接近我想要的那个。

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
相关问题