2017-04-10 146 views
1
移調

我做一些文字分析,並有一個數據,一種看起來像這樣組合樞紐和在Python

**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'),這給了我occurances的次數,和正確的是(如下圖所示)。

**TABLE 3** 
C1    C2 CT1 
ANOTHER_TEXT1 TEXT1 2 
       TEXT2 3 
ANOTHER_TEXT2 TEXT3 2 

那麼,我如何得到它在我想要的結構(表2)?這是否可能?

如果不是,我有什麼替代方案?就像在哪個結構中最接近我想要的結構一樣。

回答

2

可以使用cumcount新列,然後通過set_indexunstack重塑,最後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 
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