pandas扩展(累计)value_counts

时间:2018-04-27 13:06:34

标签: python pandas

有没有办法让值计数到数据框中的每一行?

|f1|f2|
-------
v1 | a  value_counts -> {a:1}
v2 | a  value_counts -> {a:2}
v3 | b  value_counts -> {a:2,b:1}
v4 | c  value_counts -> {c:1,a:2,b:1}

1 个答案:

答案 0 :(得分:0)

您可以在感兴趣的列上cumsum的输出上调用get_dummies

>>> pd.get_dummies(df["f2"])
   a  b  c
0  1  0  0
1  1  0  0
2  0  1  0
3  0  0  1
>>> pd.get_dummies(df["f2"]).cumsum()
   a  b  c
0  1  0  0
1  2  0  0
2  2  1  0
3  2  1  1

如果您希望value_counts等效normalize=True,则可以手动执行:

>>> x = pd.get_dummies(df["f2"]).cumsum()
>>> x.div(x.sum(axis=1), axis=0)
          a         b     c
0  1.000000  0.000000  0.00
1  1.000000  0.000000  0.00
2  0.666667  0.333333  0.00
3  0.500000  0.250000  0.25

这可能是进一步数据处理的最佳格式。虽然你可能迫使它变成类似dict的格式,但是大熊猫并不能很好地支持非标量元素,因此除了速度慢之外,它还会导致神秘的错误。那说:

>>> pd.get_dummies(df["f2"]).cumsum().apply(dict, axis=1)
0    {'a': 1, 'b': 0, 'c': 0}
1    {'a': 2, 'b': 0, 'c': 0}
2    {'a': 2, 'b': 1, 'c': 0}
3    {'a': 2, 'b': 1, 'c': 1}
dtype: object