计算DataFrame每行中系列中项目的出现次数

sri*_*amn 10 python apply pandas

我有一个pandas.DataFrame看起来像这样的.

COL1    COL2    COL3
C1      None    None
C1      C2      None
C1      C1      None
C1      C2      C3
Run Code Online (Sandbox Code Playgroud)

对于此数据帧中的每一行,我想计算每个C1,C2,C3的出现次数,并将此信息作为列附加到此数据帧.例如,第一行具有1个C1,0个C2和0个C3.最终的数据框应如下所示

COL1    COL2    COL3    C1  C2  C3
C1      None    None    1   0   0
C1      C2      None    1   1   0
C1      C1      None    2   0   0
C1      C2      C3      1   1   1
Run Code Online (Sandbox Code Playgroud)

因此,我创建了一个以C1,C2和C3作为值的系列 - 一种最重要的方法是循环遍历DataFrame的行和列,然后通过此系列,并在计数器匹配时递增计数器.但有没有一种apply方法能够以紧凑的方式实现这一目标?

And*_*den 11

你可以申请value_counts:

In [11]: df.apply(pd.Series.value_counts, axis=1)
Out[11]: 
   C1  C2  C3  None
0   1 NaN NaN     2
1   1   1 NaN     1
2   2 NaN NaN     1
3   1   1   1   NaN
Run Code Online (Sandbox Code Playgroud)

因此,您只需填写NaN和applend所需的基本值:

In [12]: df.apply(pd.Series.value_counts, axis=1)[['C1', 'C2', 'C3']].fillna(0)
Out[12]: 
   C1  C2  C3
0   1   0   0
1   1   1   0
2   2   0   0
3   1   1   1
Run Code Online (Sandbox Code Playgroud)

注意:直接为DataFrame提供value_counts方法存在一个悬而未决的问题(我认为应该由pandas 0.15引入).