熊猫,从列中选择值,其中另一列中的值高于同一列中的另一个值

时间:2021-04-12 11:03:27

标签: python-3.x pandas dataframe

我有一个 Pandas DataFrame,其中包含 id、event、timestamp 列。

我想选择事件 A 时间戳大于相同 ID 的事件 B 时间戳的所有 ID

id event timestamp
1    a      2021-01-25 10:16:46 
1    b      2021-01-22 10:16:46 
2    a      2021-01-25 10:16:46 
2    b      2021-01-28 10:16:46 
3    a      2021-01-25 10:16:46 
3    b      2021-01-25 11:16:46 

所以在上面的数据框中,只有 id 1 的事件 a 大于事件 b,所以我只想要一个包含 id 1 的列表。

我尝试了以下代码:

df = pd.read_csv("data.csv")
df = df.sort_values(by=["id", "event"])
df.astype({'timestamp': 'datetime64'}).dtypes

ids = []

for s in df["id"]:
    y = df.query("event == 'a' & id ==  @s").iloc[0,2] #select a timestamp
    z = df.query("event == 'b' & id ==  @s").iloc[0,2] #select b timestamp
    a = pd.to_datetime(y) #convert to timestamp so can compare
    b = pd.to_datetime(z)
    if sample in ids: #remove duplicate from entering the list
        pass
    elif a > b:
        ids.append(s) #add to list
    else:
        pass

print((len(ids))) #give count of unique ids

上面的代码适用于小数据集,但我的数据集包含 300000 条记录并且需要很长时间才能运行。有什么方法可以提高它的效率,让它运行得更快,而不需要一整天?

谢谢

1 个答案:

答案 0 :(得分:1)

使用 DataFrame.pivot 将两列与来自 id 的过滤器 df1.index 进行比较:

df = pd.read_csv("data.csv", parse_dates='timestamp')

df1 = df.pivot('id','event','timestamp')
print (df1)
event                   a                   b
id                                           
1     2021-01-25 10:16:46 2021-01-22 10:16:46
2     2021-01-25 10:16:46 2021-01-28 10:16:46
3     2021-01-25 10:16:46 2021-01-25 11:16:46


ids = df1.index[df1['a'] > df1['b']].tolist()
print (ids)
[1]