如何在pandas数据框中为“间隔”匹配多个列?

2024-06-26 17:39:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下熊猫数据框:

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列,每个列包含许多行,然后为每行包含一个从startend的范围/间隔。然后,每一行用特定的value(例如category1、category2等)标记

现在我有了另一个名为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数据帧,并检查间隔start:end是否与原始数据帧df中的任何行匹配。如果是,则df中的此行应标记为key_df数据帧的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落在原始df的区间1::1342-1357。同样,key_df行:

1        1471    1501    category31

对应于df中的第二行:

1        1459    1489    category7    category31

我不太确定

(1)如何在大熊猫身上完成这项任务

(2)如何在大熊猫中有效地扩展

可以从if语句开始,例如

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

但这并没有利用数据帧结构。然后必须按间隔检查,例如(df.start =< key_df.start) && (df.end => key_df.end)

我卡住了。在pandas中,在“间隔”中匹配多个列的最有效方法是什么?(如果满足此条件,则直接创建新列)


Tags: 数据keyimportpandasdf间隔valueorder
1条回答
网友
1楼 · 发布于 2024-06-26 17:39:05

可以将^{}^{}一起使用,但如果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

相关问题 更多 >