如何从pandas中的每列获取n个大多数列值

时间:2018-04-10 10:48:38

标签: python pandas dataframe mode

我知道如何使用" mode"获取数据帧中每列的最常值。例如:

df = pd.DataFrame({'A': [1, 2, 1, 2, 2, 3]})
df.mode()
   A
0  2

但我无法找到" n"数据帧的每列最常见的值?例如,对于提到的数据帧,我想跟随n = 2的输出:

   A
0  2
1  1

任何指针?

2 个答案:

答案 0 :(得分:1)

一种方法是使用pd.Series.value_counts并提取索引:

df = pd.DataFrame({'A': [1, 2, 1, 2, 2, 3]})

res = pd.DataFrame({col: df[col].value_counts().head(2).index for col in df})

#    A
# 0  2
# 1  1

答案 1 :(得分:1)

使用value_counts并通过索引选择索引值,但它分别适用于每个列,因此需要applydict comprehension DataFrame contructor。如果可能的索引不存在,则转换为Series对于更一般的解决方案是必要的,例如:

df = pd.DataFrame({'A': [1, 2, 1, 2, 2, 3], 
                   'B': [1, 1, 1, 1, 1, 1]})

N = 2
df = df.apply(lambda x: pd.Series(x.value_counts().index[:N]))

或者:

N = 2
df = pd.DataFrame({x:pd.Series( df[x].value_counts().index[:N]) for x in df.columns})

print (df)
   A    B  C
0  2  1.0  d
1  1  NaN  e

对于更一般的解决方案,请先按select_dtypes选择数字列:

df = pd.DataFrame({'A': [1, 2, 1, 2, 2, 3], 
                   'B': [1, 1, 1, 1, 1, 1],
                   'C': list('abcdef')})

N = 2
df = df.select_dtypes([np.number]).apply(lambda x: pd.Series(x.value_counts().index[:N]))
N = 2
cols = df.select_dtypes([np.number]).columns
df = pd.DataFrame({x: pd.Series(df[x].value_counts().index[:N]) for x in cols})

print (df)
   A    B  C
0  2  1.0  d
1  1  NaN  e