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

发布于 2025-01-16 21:17:56 字数 546 浏览 1 评论 0原文

我想要这样的东西: 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 之间的数字)

I want something like this:
df.groupby("A")["B"].diff()

But instead of diff(), I want be able to compute if the two rows are different or identical, and return 1 if the current row is different from the previous, and 0 if it is identical.

Moreover, I really would like to use a custom function instead of diff(), so that I can do general pairwise row operations.

I tried using .rolling(2) and .apply() at different places, but I just can not get it to work.

Edit:

Each row in the dataset is a packet.

The first row in the dataset is the first recorded packet, and the last row is the last recorded packet, i.e., they are ordered by time.

One of the features(columns) is called "ID", and several packets have the same ID.
Another column is called "data", its values are 64 bit binary values (strings), i.e., 001011010011001.....10010 (length 64).

I want to create two new features(columns):

Compare the "data" field of the current packet with the data field of the previous packet with the Same ID, and compute:

  1. If they are different (1 or 0)
  2. How different (a figure between 0 and 1)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

桃气十足 2025-01-23 21:17:56

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

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

其中 X 是您想要相同的列的列表。然后您可以创建自己的 grouper by

my_grouper = (~equal_index).cumsum()

并将其与 agg 一起使用以聚合您想要的任何函数

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

Hi I think it is best if you forgo using the grouby and shift instead:

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

where X is a list of columns you want to be identic. Then you can create your own grouper by

my_grouper = (~equal_index).cumsum()

and use it together with agg to aggregate with whatever function you wish

df.groupby(my_grouper).agg({'B':f})
离旧人 2025-01-23 21:17:56

使用 DataFrameGroupBy。移位 与比较不等于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())

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

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

EDIT: for correlation between 2 Series use:

df["dc"] = df['data'].corr(df.groupby("ID")["data"].shift())
谁与争疯 2025-01-23 21:17:56

好的,我自己解决了这个问题,

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()!

Ok, I solved it myself with

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

this does what I want.
Thank you @Arnau for inspiring me to use .shift()!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文