gpt4 book ai didi

python - 如何匹配 pandas DataFrame 中的多列 "interval"?

转载 作者:行者123 更新时间:2023-12-03 02:07:45 24 4
gpt4 key购买 nike

我有以下 pandas DataFrame:

import pandas as pd
df = pd.DataFrame('filename.csv')
print(df)

order start end value
1 1342 1357 category1
1 1459 1489 category7
1 1572 1601 category23
1 1587 1599 category2
1 1591 1639 category1
....
15 792 813 category13
15 892 913 category5
....

所以,有一个order每列包含许多行,然后是 start 的范围/间隔至end对于每一行。然后,每一行都用某个 value 进行标记。 (例如类别1、类别2等)

现在我有另一个名为 key_df 的数据框。它基本上是完全相同的格式:

import pandas as pd
key_df = pd.DataFrame(...)
print(key_df)

order start end value
1 1284 1299 category4
1 1297 1309 category9
1 1312 1369 category3
1 1345 1392 category29
1 1371 1383 category31
....
1 1471 1501 category31
...

我的目标是获取 key_df dataframe 并检查间隔是否 start:end匹配原始数据帧 df 中的任何行。如果是,则 df 中的这一行应标有 key_df数据框的value值(value)。

在上面的示例中,数据框 df最终会是这样的:

order    start    end    value        key_value
1 1342 1357 category1 category29
1 1459 1489 category7 category31
....

这是因为如果你看 key_df ,行

1        1345    1392    category29

间隔1::1345-1392落在区间 1::1342-1357原文df 。同样,key_df行:

1        1471    1501    category31

对应于df中的第二行:

1        1459    1489    category7    category31

我不太确定

(1)如何在pandas中完成这个任务

(2) 如何在 pandas 中有效扩展

可以以 if 语句开始,例如

if df.order == key_df.order:
# now check intervals...somehow

但这并没有利用数据帧结构。然后必须按时间间隔进行检查,即类似 (df.start =< key_df.start) && (df.end => key_df.end) 的内容。

我被困住了。在 pandas 的“间隔”中匹配多列的最有效方法是什么? (如果满足此条件,则创建新列非常简单)

最佳答案

您可以使用mergeboolean indexing ,但是如果DataFrames很大,缩放就会出现问题:

df1 = pd.merge(df, key_df, on='order', how='outer', suffixes=('','_key'))
df1 = df1[(df1.start <= df1.start_key) & (df1.end <= df1.end_key)]
print (df1)
order start end value start_key end_key value_key
3 1 1342 1357 category1 1345.0 1392.0 category29
4 1 1342 1357 category1 1371.0 1383.0 category31
5 1 1342 1357 category1 1471.0 1501.0 category31
11 1 1459 1489 category7 1471.0 1501.0 category31

按评论编辑:

df1 = pd.merge(df, key_df, on='order', how='outer', suffixes=('','_key'))
df1 = df1[(df1.start <= df1.start_key) & (df1.end <= df1.end_key)]
df1 = pd.merge(df, df1, on=['order','start','end', 'value'], how='left')
print (df1)
order start end value start_key end_key value_key
0 1 1342 1357 category1 1345.0 1392.0 category29
1 1 1342 1357 category1 1371.0 1383.0 category31
2 1 1342 1357 category1 1471.0 1501.0 category31
3 1 1459 1489 category7 1471.0 1501.0 category31
4 1 1572 1601 category23 NaN NaN NaN
5 1 1587 1599 category2 NaN NaN NaN
6 1 1591 1639 category1 NaN NaN NaN
7 15 792 813 category13 NaN NaN NaN
8 15 892 913 category5 NaN NaN NaN

关于python - 如何匹配 pandas DataFrame 中的多列 "interval"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com