Pandas:比较连续行

2024-09-30 23:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在google上找到了一些解决方案,但我始终无法正确地应用这些解决方案,而且我遇到了无法修复的错误,所以我不得不询问。我试图创建函数,然后将其应用于数据帧,但是遇到了这个错误,我无法修复它。在

"'numpy.int64' object has no attribute 'shift'"

所以,我有了第一个数据帧

    A   B
1   0   0
2   1   0
3   0   0
4   0   0
5   0   1
6   0   0

结果应该是这样的:

^{pr2}$

因此,当1出现在A列时,它应该在A列中重新循环,直到1出现在B列中。没有其他输入是可能的,它将用于几千行。在

谢谢。在

编辑:Samplesizedata

编辑2:这是对编辑后的答案同样有效的确认。在


Tags: 数据函数nonumpy编辑shiftobject错误
1条回答
网友
1楼 · 发布于 2024-09-30 23:31:48

请尝试以下代码:

df.A = (df.A.cumsum() != df.B.shift().cumsum()\
    .fillna(0, downcast='infer')).astype(int)

说明:

  • df.A.cumsum()产生一系列递增的数字 在A列中的每个1上。在
  • ^产生序列NaN。在
  • fillna(0, downcast='infer')将首字母{}替换为0 并将整个序列的类型改回int。在
  • (... != ...)计算一个布尔向量-几乎是你想要的。在
  • astype(int)转换上述布尔向量 到int向量。在
  • 整个结果被替换为A列。在

编辑

经过你的评论和更长的数据来源,我决定解决 问题完全相反。在

从定义要应用于每行的函数开始:

^{pr2}$

此函数使用全局变量nextRes-应该是什么 下一行的结果。在

B == 1(不管A值是什么)意思是“关闭”,但是启动 从下一行开始。在

否则(B == 0)我们有两种可能性:

  • A == 0-没有变化
  • A == 1-“打开”现在。在

然后,要执行任务,初始化“next”值并应用 每行的上述函数:

nextRes = 0
df.A = df.apply(xx, axis=1)

或者,要方便地将源数据与结果进行比较,请运行:

df['new_A'] = df.apply(xx, axis=1)

这样,您将拥有源数据和A的“新值”。在

相关问题 更多 >