我正在尝试根据不同列中的计数重新格式化表格。
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
但它仍然不是我想要的,任何人都可以帮助我吗?谢谢!
答案 0 :(得分: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
请注意,在您的示例框架中,X1
和X2
与出现次数相关联。
答案 1 :(得分:1)
您可以使用Counter来获取最常见的元素。这将作为项目对和出现次数的元组返回,因此使用列表推导仅选择项目(即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