我有以下数据框
import pandas as pd
foo = pd.DataFrame({'id': [1,1,1,1,2,2,2,2,3,3,3,3],
'time': [1,2,3,4,1,2,3,4,1,2,3,4],
'cat': ['a', 'a', 'b', 'c',
'a', 'b', 'b', 'b',
'c', 'b', 'c', 'b']
})
我想通过id
计算cat
从一个time
到下一个变化了多少次>
所以:
- 对于
id == 1
,cat
将从a变为a
1次,从a变为b
1 次和从 b 到 c
1 次 - 对于
id == 2
,cat
改变从a到b
1次,从b到b2次
次 - 对于
id == 3
,cat
改变从c 到b 2
次,从b 到c 1
时间
任何想法我可以如何计算?
理想情况下,输出应如下所示:
pd.DataFrame({'id': [1,2,3],
'a to a': [1,0,0],
'a to b': [1,1,0],
'a to c': [0,0,0],
'b to a': [0,0,0],
'b to b': [0,2,0],
'b to c': [1,0,1],
'c to a': [0,0,0],
'c to b': [0,0,2],
'c to c': [0,0,0]
})
最佳答案
类似于@Anky,我们将在组内使用 shift
来为当前值和下一个值创建标签。然后我们只需要一个crosstab
。由于 .str.cat
将使 NaN
不发生变化,并且交叉表忽略它们,我们可以确保我们只计算 组内 转换。
import pandas as pd
s = foo['cat'].str.cat(' to ' + foo.groupby('id')['cat'].shift(-1))
pd.crosstab(foo['id'], s)
cat a to a a to b b to b b to c c to b
id
1 1 1 0 1 0
2 0 1 2 0 0
3 0 0 0 1 2
关于python - 按组查找 Pandas 列的列发生了多少次切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71341171/