熊猫将数据框与条件合并

时间:2020-07-06 07:53:54

标签: python pandas dataframe merge

假设我的df1和df2看起来像这样:

    df1:
           start  end group
    index                  
    a          1    3     x
    a          3    6     x
    a          6    9     z
    b          1    7     y
    b          7   15     x
    b         15   17     y
    c          1    4     z
    c          4    9     z
    c          9   15     z
        
    df2:
           value
    index       
    a        1.0
    a        4.8
    a        7.0
    b        2.0
    b        5.0
    b        6.0
    c        2.0
    c        3.0
    c       14.0

我想在df2中创建一个名为group的新列,并按将df2.value引用到df1.start和df1.end的条件进行分配,例如:

if df2.value >= df1.start and df2.value < df1.end:
    df2.group = df1.group

例如,在索引“ a”中,范围1-3 = x; 3-6 = x; 6-9 = z,在索引“ b”中,范围1-7 = y; 7-15 = x; 15-17 = y,在索引“ c”中,范围1-4 = z; 4-9 = z; 9-15 = z

所以结果将是这样的:

df2:
       value group
index             
a        1.0     x
a        4.8     x
a        7.0     z
b        2.0     y
b        5.0     y
b        6.0     y
c        2.0     z
c        3.0     z
c       14.0     z

我该如何实现?

2 个答案:

答案 0 :(得分:0)

假设两个数据帧的长度相等,则可以使用np.where

轻松实现。
np.where((df2.value>=df1.start) & (df2.value<df1.end), df2.group=df1.group, df2.group=0)

这将评估您的情况,如果为False,则df2.group设置为0。

答案 1 :(得分:0)

尝试这种方法:

list_in = []
for i in range(0, df2.shape[0]):
    if df1.iloc[i]['start']<=df2.iloc[i]['value']<df1.iloc[i]['end']:
        list_in.append(df1.iloc[i]['group'])
    else:
        list_in.append('Nan')
df2 = df2.assign(group = list_in)