如何在熊猫数据框中将第二列的值与第一列的值进行比较?

时间:2019-07-09 20:25:53

标签: python pandas iteration

如何为同一数据帧中第一列的所有相同值提取和比较数据帧中第二列的值?

我的数据框为“ 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

任何帮助将不胜感激。 谢谢

2 个答案:

答案 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)

我认为使用groupbygrouperngroup很简单,如下所示:

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