如何在系列中的行上成对应用函数?
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 或 0)
- 多么不同(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())
我想要这样的东西: df.groupby("A")["B"].diff()
但是我希望能够计算两行是不同还是相同,而不是 diff(),如果当前行与前一行不同则为 1,如果相同则为 0 .
此外,我真的很想使用自定义函数而不是 diff(),这样我就可以进行一般的成对行操作。
我尝试在不同的地方使用 .rolling(2) 和 .apply(),但就是无法正常工作。
编辑:
数据集中的每一行都是一个数据包。
数据集中第一行是第一个记录的数据包,最后一行是最后一个记录的数据包,即按时间排序。
其中一个特征(列)称为“ID”,多个数据包具有相同的ID。 另一列称为“数据”,其值为 64 位二进制值(字符串),即 001011010011001.....10010(长度为 64)。
我想创建两个新功能(列):
将当前数据包的“数据”字段与具有相同ID的前一个数据包的数据字段进行比较,并计算:
- 如果它们不同(1 或 0)
- 多么不同(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())