微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在多个csv文件的glob操作期间高效fillna

如何解决如何在多个csv文件的glob操作期间高效fillna

我有超过 15 个 csv 文件csv file 1 to file 4 作为数据框加载时如下所示

df = pd.DataFrame({'person_id': [101,101,101],'Date':['06/08/2014 08:00:00 AM','06/01/2014 05:00:00 AM','06/03/2014 08:00:00 AM','06/09/2014 05:00:00 AM'],'Test':['A1','B2','B5','B6']})

csv file 5 to file 15 如下图所示

df1 = pd.DataFrame({'person_id': [201,201,201],'Date':[np.nan,np.nan,'B6'],'date_backup':['03/01/2014 08:00:00 AM','10/08/2014 08:00:00 AM','09/09/2014 08:00:00 AM',np.nan]})

从示例数据框 df1文件 5 到文件 15)中可以看出,我有两个 date

现在从 file 5 to file 15 开始,我想通过从另一个复制值来填充那些 date_backupDate

例如,我想做下面的事情

df1.Date.fillna(df.date_backup,inplace=True)
df1.date_backup.fillna(df.Date,inplace=True)

现在,我不确定如何在下面的代码中执行上述 fillna() 操作

我尝试了以下但不确定它是否高效和优雅

pat_dir = ['Path1\path2\La*.csv','Path3\Path4\20*.csv']
files_grabbed = []
for files in pat_dir:
    files_grabbed.extend(glob.glob(files))
d = {'date_backup':'Date'}
cols = ['Date','Test','value','person_id']
dfs = [pd.read_csv(f,sep=",",low_memory=False).rename(columns=d).reindex(columns=cols) 
       for f in files_grabbed]   #thanks to Jezrael for this code

在上面的代码中,您可以看到我正在重命名 date_backup 列。

如何高效优雅地填充()

我希望我的输出是连接/附加 15 个 csv 文件的数据框,如下所示(带有一个日期列)。我唯一的问题是如何在附加数据帧之前填充(),所以我将只有 Date

enter image description here

解决方法

如果需要在一个 DataFrame 中填充列,可以使用 if 语句作为 fillna 如果存在列 date_backup

dfs= []
for f in files_grabbed:
    df1 = pd.read_csv(f,sep=",",low_memory=False)
    if 'date_backup' in df1.columns:
        df1.Date = df1.Date.fillna(df1.date_backup)
      
    #not sure if necessary rename and reindex
    df1 = df1.rename(columns=d).reindex(columns=cols) 
    dfs.append(df1)

另一个想法是在 date_backup 之后为每个 DataFramefillna 添加 concat

cols = ['Date','Test','value','person_id','date_backup']
dfs = [pd.read_csv(f,low_memory=False).rename(columns=d).reindex(columns=cols) 
   for f in files_grabbed] 


df = pd.concat(dfs)
df.Date = df.Date.fillna(df.pop('date_backup'))
   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。