所以,我有一个 df,其中一个问题在不同的列中得到回答:
Main activity at work Main activity at work .1 Main activity at work .2 ... Main activity at work .20
0 machine operator administrator null cleaning
1 null null accountant cleaning
2 machine operator null null null
3 null administrator null cleaning
等等。每列只有一种类型的答案,适用于它。
现在,事情很简单,我想一次对所有列执行 value_counts()。所以我想要的输出是:
main activity at work
machine operator 20
main activity at work .1
administrator 14
main activity at work .2
accountant 10
等等。我的问题是列名。我使用了这个代码:
activity = pd.Series('Main activity at work .'+ pd.Series(np.arange(1,21)).map(str))
for num in activity:
print(df['activity'].value_counts(), '\n')
但我收到此错误消息:
KeyError: 'activity'
错误是什么,或者有没有更好的方法来做?
编辑:“工作中的主要活动”、“工作中的主要活动 .1”等是列名称,因此我没有所有这些名称的名称。这就是我的循环最初代表的意思。
答案 0 :(得分:0)
您正在调用 df['activity']
,这意味着您需要“活动”列。当你用引号写一些东西时,它是一个字符串而不是一个变量。所以这是行不通的。我没有测试它,但如果你想有机会必须写一些类似 df[num] 的东西。但即使这应该在这里工作,也是一种更实用的方法:使用 itmes() 方法遍历列。
df = pd.DataFrame({'species': ['bear', 'bear', 'marsupial'],
'population': [1864, 22000, 80000]},
)
dict = {}
for label, content in df.items():
series = content.value_counts()
dict[label] = series
print(series)
为了多一点理解。变量标签是列名,内容是它的内容,作为熊猫系列。我不知道你是否只需要打印输出,所以我额外使用了一个字典来存储输出。
答案 1 :(得分:0)
您可以融合数据并对其执行 value_counts:
activity_counts= (df.melt(var_name="question", value_name="activity")
.value_counts()
.reindex(df.columns, level=0)) # preserve the order of question ids
print(activity_counts)
question activity
Main activity at work machine operator 2
Main activity at work .1 administrator 2
Main activity at work .2 accountant 1
Main activity at work .20 cleaning 3
dtype: int64
activity_counts 是一个带有 pd.Series
键的 pd.MultiIndex
。如果此对象令人困惑,您可以使用 .reset_index()
将其变成更熟悉的 pd.DataFrame
表示