基于&运算的子集熊猫数据框来自另一个数据框的列

时间:2020-07-27 15:32:25

标签: python pandas dataframe

我有两个不同的数据集。根据{{​​1}}的条件,我想创建一个新的数据集。

column values in these 2 data frames

d1=pd.DataFrame({'ID':[57,58,59,68,61],'Period':['Day_3','Day_4','Day_5','Day_3','Day_2'],'pay':[1000,3000,2000,1000,5000]}) d2=pd.DataFrame({'ID':[68,58,59,42],'Period':['Day_1','Day_8','Day_9','Day_6'],'pay':[10000,30000,20000,10000]}) d1

d2
如果这些条件成立,

ID Period pay ID Period pay 0 57 Day_3 1000 0 68 Day_1 10000 1 58 Day_4 3000 1 58 Day_8 30000 2 59 Day_5 2000 2 59 Day_9 20000 3 68 Day_3 1000 3 42 Day_6 10000 4 61 Day_2 5000 将是该子集 temp

temp=d1[d1.ID.isin(d2.ID) & d1['Period']<=d2['Period']]给出部分结果,而d1[d1.ID.isin(d2.ID)则抛出错误 d1['Period']<=d2['Period']]我从天中提取数字,并将这些值存储为day_numbers列,并执行了上面的代码,我得到了相同的错误。

我需要结果

ValueError: Can only compare identically-labeled Series objects

1 个答案:

答案 0 :(得分:2)

在列ID上使用DataFrame.merge,并通过比较mask的数字部分来创建布尔值Period,然后使用此掩码过滤行:

df = d1.merge(d2[['ID', 'Period']], on='ID', suffixes=['', '_r'])
mask = (
    df['Period'].str.split('_').str[-1].astype(int) <=
    df['Period_r'].str.split('_').str[-1].astype(int)
)
df = df[mask].drop('Period_r', 1)

结果:

print(df)

   ID Period   pay
0  58  Day_4  3000
1  59  Day_5  2000
相关问题