python - 按组查找 Pandas 列的列发生了多少次切换

标签 python python-3.x pandas

我有以下数据框

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 == 1cat从a变为a1次,从a变为b 1 次和 从 b 到 c 1 次
  • 对于id == 2cat改变从a到b1次,从b到b2次
  • 对于id == 3cat 改变从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/

相关文章:

python - 如何编写 Django 查询,其中 WHERE 条件的左侧是数学表达式?

python 计算哪些属性属于子类

python - 滚动列值的累积和直到满足条件

Python - Pandas - 时间戳和周期范围之间的区别

python - 将两个指数不匹配的 Pandas 系列相乘

python - 关于将大量脚本部署到 Web 服务器(Java、Python)的建议

python - 组合常见搭配的 NLP 过程

javascript - 在提交之前调用表单内的 ajax 显示 `Uncaught ReferenceError`

python - 如何在 Python 的 imaplib 的 Gmail IMAP 搜索中包含聊天?

python - os.path.expanduser ("~"的替代方案)?