我有一个数据框(temp1 = temp2.map(f => f.filter(parsed => parsed._2.errors.nonEmpty))
)如下:
df
我想根据以下内容比较行:
对于每个项目,将d = {'Item':['x','y','z','x','z'], 'Count' : ['10', '11', '12', '9','10'], 'Date' : pd.to_datetime(['2018-8-14', '2018-8-14', '2018-8-14', '2018-8-13','2018-8-13'])}
df= pd.DataFrame(data=d)
Item Count Date
x 10 2018-08-14
y 11 2018-08-14
z 12 2018-08-14
x 9 2018-08-13
x 9 2018-08-12
z 10 2018-08-13
与max(Date)
的计数进行比较。
这意味着应该比较项目max(Date) - 1
,日期x
和2018-08-13
的计数。如果2018-08-14
的计数较大,则应选择该行并将其存储在其他数据框中。
与项目max(Date)
相同,它应将日期z
和2018-08-13
的计数进行比较,并且由于计数较大,因此应为2018-08-14
的项目选择具有计数的行z
。
输出: df2
12
我尝试了以下操作:
Item Count Date
x 10 2018-08-14
z 12 2018-08-14
答案 0 :(得分:1)
将merge
与键Item
一起使用
df.loc[df.reset_index().merge(df,on='Item').loc[lambda x : (x['Count_x']>x['Count_y'])&(x['Date_x']>x['Date_y'])]['index'].unique()]
Out[49]:
Item Count Date
0 x 10 2018-08-14
2 z 12 2018-08-14
答案 1 :(得分:0)
感谢@Wen,我得以将他的工作分解为更基本的版本。
创建具有max(date)
和max(date)-1
值的临时数据集
t_day = df[df.Date == df.Date.max()]
y_day = df[df.Date == df.Date.max() - pd.to_timedelta(1, unit='d')]
合并临时数据帧以创建主临时文件
temp = t_day.merge(y_day, on = 'Item', how='outer')
temp = temp.dropna()
定义功能以创建所需条件
def func(row):
if (int(row['Count_x']) > int(row['Count_y']) & (row['Date_x'] > row['Date_y'])):
return '1'
else:
return '0'
temp['cond'] = temp.apply(func, axis=1)
删除未使用的列
temp.drop(['Count_y','Date_y','cond'],axis = 1, inplace=True)
print(temp)
现在它返回:
Count_x Date_x Item
10 2018-08-14 x
12 2018-08-14 z