如何在系列中的行上成对应用函数?

How to apply a function pairwise on rows in a series?

我想要这样的东西: df.groupby("A")["B"].diff()

但是我希望能够计算两行是不同还是相同,而不是 diff(),如果当前行与前一行不同则为 1,如果相同则为 0 .

此外,我真的很想使用自定义函数而不是 diff(),这样我就可以进行一般的成对行操作。

我尝试在不同的地方使用 .rolling(2) 和 .apply(),但就是无法正常工作。

编辑:

数据集中的每一行都是一个数据包。

数据集中第一行是第一个记录的数据包,最后一行是最后一个记录的数据包,即按时间排序。

其中一个特征(列)称为“ID”,多个数据包具有相同的ID。 另一列称为“数据”,其值为 64 位二进制值(字符串),即 001011010011001.....10010(长度为 64)。

我想创建两个新功能(列):

将当前数据包的“数据”字段与具有相同ID的前一个数据包的数据字段进行比较,并计算:

  1. 如果它们不同(1 或 0)
  2. 多么不同(0 和 1 之间的数字)

您好,我认为您最好放弃使用 grouby 并改用 shift:

equal_index = (df == df.shift(1))[X].all(axis=1)

其中 X 是您希望相同的列的列表。然后你可以通过

创建你自己的石斑鱼
my_grouper = (~equal_index).cumsum()

并将它与 agg 一起使用,以使用您想要的任何函数进行聚合

df.groupby(my_grouper).agg({'B':f})

好的,我用

自己解决了
def create_dc(df: pd.DataFrame):
    dc = df.groupby("ID")["data"].apply(lambda x: x != x.shift(1)).astype(int)
    dc.fillna(1, inplace=True)
    df["dc"] = dc

这就是我想要的。 感谢@Arnau 启发我使用 .shift()!

使用DataFrameGroupBy.shift with compare for not equal by Series.ne:

df["dc"] = df.groupby("ID")["data"].shift().ne(df['data']).astype(int)

编辑:2 个系列之间的相关性使用:

df["dc"] = df['data'].corr(df.groupby("ID")["data"].shift())