如何将一列中的行值与组中另一列中的所有其他行进行比较?

干橄榄

我有一个具有以下列的数据框:user_id,product_id,created_at和remove_at。我想添加一个布尔列“ is_switch”,如果对于给定的用户,created_at的时间戳是timedelta内(比如说1秒),而该用户组中任何其他行的remove_at则为true。如何在不遍历每一行的情况下执行此操作,或者这是执行该操作的适当方法?

我正在尝试编写一个将与.apply一起使用的自定义函数,该函数将在每个用户组上运行,但是我不确定如何在一列中将行与所有其他行进行比较。

# Code to create sample data frame. 
# the below are just timestamps that are within a second of each other.

import datetime

a = datetime.datetime.now()
a2 = a-datetime.timedelta(seconds=1)
b = datetime.datetime.now()-datetime.timedelta(days=4)
b2 = b-datetime.timedelta(seconds=1)
c = datetime.datetime.now()-datetime.timedelta(days=40)
c2 = c - datetime.timedelta(seconds=1)
d = datetime.datetime.now()-datetime.timedelta(days=30)
d2 = d - datetime.timedelta(seconds=1)
e = datetime.datetime.now()-datetime.timedelta(days=60)
e2 = e - datetime.timedelta(seconds=1)
f = datetime.datetime.now()-datetime.timedelta(days=100)
g = datetime.datetime.now()-datetime.timedelta(days=99)

df = pd.DataFrame(
{"user_id" : [0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
"product_id" : [100, 101, 102, 101, 102, 104, 105, 106, 107, 105, 106, 107],
"created_at" : [a, a, b, c, d, c, f, f, e2, f, f, d],
"removed_at" : ['NaT', b2, 'NaT', d2, 'NaT', 'NaT', e, g, 'NaT', e2, g, b]},
index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
df

print(df)

产生这个:


        user_id  product_id                 created_at                 removed_at
0         0         100 2019-08-04 09:15:05.200981                        NaT
1         1         101 2019-08-04 09:15:05.200981 2019-07-31 09:15:04.201063
2         1         102 2019-07-31 09:15:05.201063                        NaT
3         2         101 2019-06-25 09:15:05.201121 2019-07-05 09:15:04.201179
4         2         102 2019-07-05 09:15:05.201179                        NaT
5         2         104 2019-06-25 09:15:05.201121                        NaT
6         3         105 2019-04-26 09:15:05.201290 2019-06-05 09:15:05.201235
7         3         106 2019-04-26 09:15:05.201290 2019-04-27 09:15:05.201324
8         3         107 2019-06-05 09:15:04.201235                        NaT
9         4         105 2019-04-26 09:15:05.201290 2019-06-05 09:15:04.201235
10        4         106 2019-04-26 09:15:05.201290 2019-04-27 09:15:05.201324
11        4         107 2019-07-05 09:15:05.201179 2019-07-31 09:15:05.201063

所以我目前有这样的事情:

group_by_user = df.groupby('user_id')

def calculate_is_switch(grp):
    # What goes here? how can i do it without iterating over each row?

# group_by_user.apply(calculate_is_switch)

我想添加“ is_switch”列,因此输出如下:

    user_id  product_id                 created_at                 removed_at  \
0         0         100 2019-08-04 09:15:05.200981                        NaT   
1         1         101 2019-08-04 09:15:05.200981 2019-07-31 09:15:04.201063   
2         1         102 2019-07-31 09:15:05.201063                        NaT   
3         2         101 2019-06-25 09:15:05.201121 2019-07-05 09:15:04.201179   
4         2         102 2019-07-05 09:15:05.201179                        NaT   
5         2         104 2019-06-25 09:15:05.201121                        NaT   
6         3         105 2019-04-26 09:15:05.201290 2019-06-05 09:15:05.201235   
7         3         106 2019-04-26 09:15:05.201290 2019-04-27 09:15:05.201324   
8         3         107 2019-06-05 09:15:04.201235                        NaT   
9         4         105 2019-04-26 09:15:05.201290 2019-06-05 09:15:04.201235   
10        4         106 2019-04-26 09:15:05.201290 2019-04-27 09:15:05.201324   
11        4         107 2019-07-05 09:15:05.201179 2019-07-31 09:15:05.201063   

    is_switch  
0       False  
1       False  
2        True  
3       False  
4        True  
5       False  
6       False  
7       False  
8        True  
9       False  
10      False  
11      False  
耶斯列尔

GroupBy.apply与自定义函数一起使用-首先用一些默认值日期时间替换缺失值,例如Timestamp.min,然后按组将具有广播的列进行比较-使用created_atby的所有值removed_at,获取绝对值,按1秒进行比较,并按以下方式True每行至少返回一个any

val = pd.Timedelta(1, unit='s')

def f(x):
    y = x['created_at'].values - x['removed_at'].values[:, None]
    y = np.any((np.abs(y).astype(np.int64) <= val.value), axis=0)

    return pd.Series(y, index=x.index)

df['is_switch'] = (df.assign(removed_at = df['removed_at'].fillna(pd.Timestamp.min))
                     .groupby('user_id')
                     .apply(f)
                     .reset_index(level=0, drop=True))

print(df)
    user_id  product_id                 created_at                 removed_at  \
0         0         100 2019-08-04 16:22:39.309093                        NaT   
1         1         101 2019-08-04 16:22:39.309093 2019-07-31 16:22:38.309093   
2         1         102 2019-07-31 16:22:39.309093                        NaT   
3         2         101 2019-06-25 16:22:39.309093 2019-07-05 16:22:38.309093   
4         2         102 2019-07-05 16:22:39.309093                        NaT   
5         2         104 2019-06-25 16:22:39.309093                        NaT   
6         3         105 2019-04-26 16:22:39.309093 2019-06-05 16:22:39.309093   
7         3         106 2019-04-26 16:22:39.309093 2019-04-27 16:22:39.309093   
8         3         107 2019-06-05 16:22:38.309093                        NaT   
9         4         105 2019-04-26 16:22:39.309093 2019-06-05 16:22:38.309093   
10        4         106 2019-04-26 16:22:39.309093 2019-04-27 16:22:39.309093   
11        4         107 2019-07-05 16:22:39.309093 2019-07-31 16:22:39.309093   

    is_switch  
0       False  
1       False  
2        True  
3       False  
4        True  
5       False  
6       False  
7       False  
8        True  
9       False  
10      False  
11      False 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将列的一行与组中的所有其他行进行比较

将一列的值与另一列中的所有值进行比较

如何将一列中连续行的所有值相加而另一列的值不变

将列条目与同一列中的所有其他条目进行比较

有没有办法将数据帧的一列中的所有行与另一个数据帧(火花)的另一列中的所有行进行比较?

如何将所有列与熊猫中的一列进行比较?

如何将第一列的值附加到pandas数据框中的所有其他列

比较一列中的float值与pandas DataFrame中的所有其他列

如何在一列中获取具有最小值的行,并按另一列进行分组,同时保留其他列?

如何根据行中的特定值和熊猫中的另一列对行进行分组?

如何将一列中的所有值相互比较

查找一列中具有相同值而另一列中具有其他值的行?

如何在不删除/删除其他重复行的情况下对 1 列中具有重复值的行和另一列中具有不同值的行进行分组?

如何将Pandas DataFrame中的值与上一行和上一列中的值进行比较?

如何将一列的值与其他列的多个值进行比较?

在R中按组比较一列的值与另一列中的多个值

如何将第一行的列值相乘添加到组中的所有其他行?

如果一列的值出现在另一列中,则对行进行分组

如何将一列中所有行中曾经使用过的所有唯一符号插入到另一列中

如何将一行中的值与所有其他行中的值进行比较?

如何将一列中的值复制到R中另一列中具有相同值的行?

如何将一个数据帧中某些列的值与另一数据帧中同一列集的值进行比较?

熊猫:通过将一列的值与另一行中同一列的另一个值进行比较来过滤行

如何对行进行分组,在一列中计数,在另一列中求和?

如何为另一列中的每一行重复所有列值

如何将一列中的值映射到数据框的另一列?

将一列垂直合并到另一列中,并在Pandas中填充其他列的值

通过density_rank()对行进行分组并遍历每个子组,然后比较该子组的下一行中的另一列?

如何将表格一列中的字符串数组中的数据与表格中另一列中的JSON数据进行比较?