目标:
我想编写一个函数,该函数允许我在args
中传递几列,然后计算每个不同值的出现次数,最终将结果粘贴到新的DataFrame
中。 / p>
例如,按照下面的模式,我想计算a,b,c列中1,2,3,4,5的等级出现了多少次:
+---+---+---+---+---+
| a | b | c | d | e |
+---+---+---+---+---+
| 1 | 2 | 1 | 3 | 4 |
+---+---+---+---+---+
| 1 | 2 | 2 | 4 | 5 |
+---+---+---+---+---+
| 1 | 3 | 2 | 2 | 4 |
+---+---+---+---+---+
| 5 | 5 | 2 | 2 | 3 |
+---+---+---+---+---+
| 1 | 4 | 4 | 2 | 5 |
+---+---+---+---+---+
代码:
我尝试了以下操作,但没有用
new_df['a_count'] = df.groupby('a').size()
new_df['b_count'] = df.groupby('b').size()
new_df['c_count'] = df.groupby('c').size()
如何使它作为一个单一功能工作,允许用户一次全部传递多列?
答案 0 :(得分:1)
您可以尝试使用pd.Series.value_counts()
:
# Mock df
df = pd.DataFrame({key:np.random.randint(1, 6, 5) for key in "abcde"})
a b c d e
0 5 5 2 4 5
1 1 1 2 3 4
2 1 1 1 4 4
3 2 1 1 1 4
4 5 2 4 5 3
cols = ["a", "b", "c"]
new_df = pd.concat([df[c].value_counts() for c in cols], 1).fillna(0).astype(int)
print(new_df)
a b c
1 2 3 2
2 1 1 2
4 0 0 1
5 2 1 0