我正在处理一个数据集,我需要识别多个重复行之间的最大日期差异。我下面的代码可以满足我的要求(减去我收到的“A value is试图在 DataFrame 切片的副本上设置”警告),但我很好奇如何执行相同的任务而不必创建一个新的数据框作为中间体。我预计这是避免内存限制的好习惯,但是,我很难弄清楚这种类型的流程。任何指导都会非常有帮助!
df = pd.DataFrame({'Key': ['10003', '10009', '10009', '10009', '10009','10034','10034', '10034'],
'Num1': [12,13,13,13,13,14,14,14],
'Num2': [121,122,122,124,125,126,127,128],
'Date1': [20120506, 20120506, 20120506,20120506,20120620,20120206,20120206,20120405],
'Date2': [20120528, 20120507, 20120615,20120629,20120621,20120305,20120506,20120506]})
df_dup = df[df.duplicated(subset=['Key', 'Num1','Num2','Date1'],keep=False)]
df = df.drop_duplicates(subset=['Key','Num1','Num2','Date1'],keep=False)
df_dup['Date2'] = pd.to_datetime(df_dup['Date2'], format='%Y%m%d')
df_dup['Date1'] = pd.to_datetime(df_dup['Date1'], format='%Y%m%d')
df_dup['DateDiff'] = (df_dup['Date2'] - df_dup['Date1']).dt.days
df_dup = df_dup.sort_values('DateDiff', ascending=False).drop_duplicates(subset=['Key','Num1','Num2','Date1'])
df = pd.concat([df,df_dup])
我的代码步骤:
- 1a。查找所有重复的行并将其存储在 df_dup
- 1b。删除原始 df 中的重复行
- 2 在df_dup中,将日期字段转换为日期时间进行比较
- 3 在 df_dup 中,为日期差异创建新列
- 4 仅保留最大“DateDiff”行
- 5 最后,连接 df 和 df_dup
最终结果比原来的df少一行。
最佳答案
我相信您只想处理由 bool 掩码过滤的行m
:
m = df.duplicated(subset=['Key', 'Num1','Num2','Date1'],keep=False)
d1 = pd.to_datetime(df.loc[m, 'Date2'], format='%Y%m%d')
d2 = pd.to_datetime(df.loc[m, 'Date1'], format='%Y%m%d')
df['DateDiff'] = (d1 - d2).dt.days
m1 = (df.loc[m, :]
.sort_values('DateDiff', ascending=False)
.duplicated(subset=['Key','Num1','Num2','Date1'])
.reindex(df.index, fill_value=False))
df = df[~m1]
print (df)
Date1 Date2 Key Num1 Num2 DateDiff
0 20120506 20120528 10003 12 121 NaN
2 20120506 20120615 10009 13 122 40.0
3 20120506 20120629 10009 13 124 NaN
4 20120620 20120621 10009 13 125 NaN
5 20120206 20120305 10034 14 126 NaN
6 20120206 20120506 10034 14 127 NaN
7 20120405 20120506 10034 14 128 NaN
关于python - 如何避免创建中间数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48856082/