通过用几列中不同的值对出现次数进行计数来创建新的df

时间:2019-02-18 01:51:20

标签: python pandas dataframe for-loop

目标:

我想编写一个函数,该函数允许我在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()

如何使它作为一个单一功能工作,允许用户一次全部传递多列?

1 个答案:

答案 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