我有两个不同的数据集。根据{{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
答案 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