如何为同一数据帧中第一列的所有相同值提取和比较数据帧中第二列的值?
我的数据框为“ df”:
Name Datetime
Bob 26-04-2018 12:00:00
Claire 26-04-2018 12:00:00
Bob 26-04-2018 12:30:00
Grace 27-04-2018 08:30:00
Bob 27-04-2018 09:30:00
我想将新列作为df ['Id']添加到数据帧中,以便对于具有相同名称的用户,如果datetime值相差不超过30分钟,则将为它们分配相同的值值,如果日期时间差大于30分钟,则会为其分配一个不同的ID。
我认为可以通过迭代遍历来实现,但是我不确定该怎么做。另外,因为我拥有大量数据集,还有更好的方法吗?
我对数据框的预期输出为:
Name Datetime Id
Bob 26-04-2018 12:00:00 1
Claire 26-04-2018 12:00:00 2
Bob 26-04-2018 12:10:00 1
Bob 26-04-2018 12:20:00 1
Claire 27-04-2018 08:30:00 3
Bob 27-04-2018 09:30:00 4
任何帮助将不胜感激。 谢谢
答案 0 :(得分:2)
我将按名称,日期时间对数据框进行排序,以识别不同的组,然后按原始数据框顺序为每个组分配一个ID值。
代码可能是:
# sort data frame on Name and datetime
df.sort_values(['Name', 'Datetime'], inplace=True)
df1 = df.shift()
# identify new Ids
df.loc[(df1.Name!=df.Name)
|(df.Datetime-df1.Datetime>pd.Timedelta(minutes=30)), 'tmp'] = 1
del df1 # non longer usefull
# ok, one different tmp value for each group
df['tmp'] = df['tmp'].cumsum().ffill()
# compute Ids in original dataframe orders
ids = pd.DataFrame(df['tmp'].drop_duplicates().sort_index())
ids['Id'] = ids.reset_index(drop=True).index + 1
# and get the expected result
df = df.reset_index().merge(ids, on='tmp').set_index('index').sort_index()\
.drop(columns='tmp').rename_axis(None)
它给出了预期的结果:
Name Datetime Id
0 Bob 2018-04-26 12:00:00 1
1 Claire 2018-04-26 12:00:00 2
2 Bob 2018-04-26 12:10:00 1
3 Bob 2018-04-26 12:20:00 1
4 Claire 2018-04-27 08:30:00 3
5 Bob 2018-04-27 09:30:00 4
答案 1 :(得分:0)
我认为使用groupby
,grouper
和ngroup
很简单,如下所示:
df['Id'] = df.groupby([pd.Grouper(freq='30T', key='Datetime'), 'Name']).ngroup().add(1)
Out[423]:
Name Datetime Id
0 Bob 2018-04-26 12:00:00 1
1 Claire 2018-04-26 12:00:00 2
2 Bob 2018-04-26 12:10:00 1
3 Bob 2018-04-26 12:20:00 1
4 Claire 2018-04-27 08:30:00 3
5 Bob 2018-04-27 09:30:00 4