2015-06-15 22 views
4

我正在嘗試根據不同列中的計數重新格式化表格。在Python中格式化數據透視表

df = pd.DataFrame({'Number': [1, 2, 3, 4, 5], 'X' : ['X1', 'X2', 'X3', 'X3', 'X3'], 'Y' : ['Y2','Y1','Y1','Y1', 'Y2'], 'Z' : ['Z3','Z1','Z1','Z2','Z1']}) 

    Number X Y Z 
0  1 X1 Y2 Z3 
1  2 X2 Y1 Z1 
2  3 X3 Y1 Z1 
3  4 X3 Y1 Z2 
4  5 X3 Y2 Z1 

我想頂行被X排序由頻率(X3第一,因爲它似乎兩次)然後,對於每個X值,計數其Y和Z值的頻率和打印一個顯示了最。

X3 X2 X1 
Y Y1 Y1 Y2   
Z Z1 Z1 Z3 

到目前爲止,我有一些代碼可以排序

import pandas as pd 

df = pd.DataFrame({'Number': [1, 2, 3, 4, 5], 'X' : ['X1', 'X2', 'X3', 'X3', 'X3'], 'Y' : ['Y2','Y1','Y1','Y1', 'Y2'], 'Z' : ['Z3','Z1','Z1','Z2','Z1']}) 
pivot = df.pivot_table(index='X', columns=['Y', 'Z'], values = 'Number', aggfunc='count') 
# clean the table from NaNs (not necessary, but more beautiful): 
pivot.fillna(0, inplace=True) 
pivot['sum'] = pivot.sum(axis=1) 
pivot.sort('sum', ascending=False, inplace=True) 
df = pivot[:5].transpose() 
df.to_csv('sorted.csv') 

和輸出:

Y Z X3 X1 X2 
Y1 Z1 1 0 1 
Y1 Z2 1 0 0 
Y2 Z1 1 0 0 
Y2 Z3 0 1 0 
sum  3 1 1 

但它仍然不是我要找的,任何人都可以幫我這個?謝謝!

回答

2

您將需要一個自定義mode函數,因爲如果沒有出現至少兩次,pandas.Series.mode不起作用;雖然下面的一個不是最有效的一個,它的工作:

>>> mode = lambda ts: ts.value_counts(sort=True).index[0] 
>>> cols = df['X'].value_counts().index 
>>> df.groupby('X')[['Y', 'Z']].agg(mode).T.reindex(columns=cols) 
    X3 X1 X2 
Y Y1 Y2 Y1 
Z Z1 Z3 Z1 

注意,您在抽樣框,X1X2在occurances的數量並列。

1

您可以使用計數器來獲取最常見的元素。這是作爲項目對的元組以及出現次數返回的,所以使用列表理解來選擇項目(即i [0]是項目)。

from collections import Counter 

X = [i[0] for i in Counter(df.X).most_common()] 

然後使用列表理解和.loc通過最常見的兩個X遍歷並選擇最常見的「Y」和「Z」值。

Y = [Counter(df.loc[df.X == x, 'Y']).most_common(1)[0][0] for x in X] 

Z = [Counter(df.loc[df.X == x, 'Z']).most_common(1)[0][0] for x in X] 

>>> pd.DataFrame({'X': X, 'Y': Y, 'Z': Z}).T 
    0 1 2 
X X3 X2 X1 
Y Y1 Y1 Y2 
Z Z1 Z1 Z3