我知道如何使用" mode"获取数据帧中每列的最常值。例如:
df = pd.DataFrame({'A': [1, 2, 1, 2, 2, 3]})
df.mode()
A
0 2
但我无法找到" n"数据帧的每列最常见的值?例如,对于提到的数据帧,我想跟随n = 2的输出:
A
0 2
1 1
任何指针?
答案 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
并通过索引选择索引值,但它分别适用于每个列,因此需要apply
或dict 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