python - 如何避免创建中间数据框?

标签 python pandas dataframe concatenation

我正在处理一个数据集,我需要识别多个重复行之间的最大日期差异。我下面的代码可以满足我的要求(减去我收到的“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/

相关文章:

Python - 为什么在另一个实例方法中调用此实例方法时不需要括号?

python - PANDAS - 绘制特定行并更改列的顺序

python - 如何通过循环将字典列表的列表转换为数据框

python - 如何在不丢失名称的情况下加入数据框

python - Jupyter Notebook 和 Conda 命令行之间的包不一致

python - Django-Rest-Framework JWT 单元测试说 "No Authentication Provided"

python - 将时间序列的时间精度降低到毫秒

python - 从非日期的最接近值切片数据框

python-3.x - 如何使用python将字符串日期时间转换为int

R 中的 JSON(使用 jsonlite)解析错误