如何在多个 csv 文件的 glob 操作期间有效地填充 na
How to fillna efficiently during glob operation of multiple csv files
我有超过 15 个 csv 文件。 csv file 1 to file 4
作为数据框加载时如下所示
df = pd.DataFrame({'person_id': [101,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,201],
'Date':[np.nan,np.nan,'06/03/2014 08:00:00 AM','06/09/2014 05:00:00 AM'],
'Test':['A1','B2','B5','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_backup
或 Date
。
例如,我想做下面的事情
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*.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
列。
如何高效优雅地填充na()
我希望我的输出是 concatenated/appended 15 个 csv 文件的数据帧,如下所示(带有一个日期列)。我唯一的问题是如何在附加数据帧之前填充 na(),所以我将只有 Date
列
如果需要在一个 DataFrame 中填充列,则可以使用 if
语句 fillna
if exist column 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)
另一个想法是在 concat
之后为每个 DataFrame
和 fillna
添加 date_backup
:
cols = ['Date','Test','value','person_id', 'date_backup']
dfs = [pd.read_csv(f, sep=",",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'))
我有超过 15 个 csv 文件。 csv file 1 to file 4
作为数据框加载时如下所示
df = pd.DataFrame({'person_id': [101,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,201],
'Date':[np.nan,np.nan,'06/03/2014 08:00:00 AM','06/09/2014 05:00:00 AM'],
'Test':['A1','B2','B5','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_backup
或 Date
。
例如,我想做下面的事情
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*.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
列。
如何高效优雅地填充na()
我希望我的输出是 concatenated/appended 15 个 csv 文件的数据帧,如下所示(带有一个日期列)。我唯一的问题是如何在附加数据帧之前填充 na(),所以我将只有 Date
列
如果需要在一个 DataFrame 中填充列,则可以使用 if
语句 fillna
if exist column 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)
另一个想法是在 concat
之后为每个 DataFrame
和 fillna
添加 date_backup
:
cols = ['Date','Test','value','person_id', 'date_backup']
dfs = [pd.read_csv(f, sep=",",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'))