有没有办法让值计数到数据框中的每一行?
|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}
答案 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