我有两个不同的数据集。根据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=d1[d1.ID.isin(d2.ID) & d1['Period']<=d2['Period']],则temp将是子集
d1[d1.ID.isin(d2.ID)给出了部分结果,而d1['Period']<=d2['Period']] ValueError: Can only compare identically-labeled Series objects抛出了一个错误,我从days中提取了数字,并将这些值存储为day_numbers列,然后执行上面的代码,我得到了同样的错误。
我要的结果是,
ID Period pay
0 58 Day_4 3000
1 59 Day_5 2000
How to get this result?发布于 2020-07-27 23:38:23
在列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 2000https://stackoverflow.com/questions/63118590
复制相似问题