读取多个 csv 文件并将它们转换为系列对象的优雅方式
Elegant way to read multiple csv files and convert them to series objects
我有 5 个 csv 文件要读取,但使用该 csv 文件的列名称和操作保持不变。
例如,在我的代码中,我执行以下 3 个步骤(但对所有 5 个文件都重复)
a) 我读取 csv 并将它们存储在数据框中
b) 将数据帧内容转换为大写
c) 使用子集删除重复项 = sourceName
列
d) 创建一个系列对象
test_map = pd.read_csv('test_map.csv')
test_map = test_map .apply(lambda x: x.astype(str).str.upper())
test_map = test_map .drop_duplicates(subset=['sourceName'])
test_Id_map = test_map.set_index(['sourceName'])['Id']
val_op_map = pd.read_csv('op_val_map.csv')
val_op_map = val_op_map.apply(lambda x: x.astype(str).str.upper())
val_op_map = val_op_map.drop_duplicates(subset=['sourceName'])
val_op_id_map = val_op_map.set_index(['sourceName'])['Id']
test2_map = pd.read_csv('test2_map.csv')
test2_map = test2_map.apply(lambda x: x.astype(str).str.upper())
test2_map = test2_map.drop_duplicates(subset=['sourceName'])
test2_id_map = test2_map.set_index(['sourceName'])['Id']
visit_map = pd.read_excel('visit_map.xlsx')
visit_map = visit_map.apply(lambda x: x.astype(str).str.upper())
visit_map = visit_map.drop_duplicates(subset=['sourceName'])
visit_Id_map = visit_map.set_index(['sourceName'])['Id']
demo_map = pd.read_excel('demo_map.xlsx')
demo_map = demo_map.apply(lambda x: x.astype(str).str.upper())
demo_map = demo_map.drop_duplicates(subset=['sourceName'])
demo_id_map = demo_map.set_index(['sourceName'])['Id']
我觉得针对不同的文件多次重复同一行代码既不高效也不优雅。还有其他更好的写法吗?
我最终想要输出 5 个系列对象,它们是 test_Id_map
、demo_id_map
、visit_id_map
、test2_id_map
、val_op_id_map
假设您想要一个已处理的数据帧列表及其 ID 映射,您可以这样做:
filenames = ['test_map.csv','op_val_map.csv', 'test2_map.csv','visit_map.xlsx','demo_map.xlsx']
def preprocessing(fname):
df= pd.read_csv(fname)
df= df.apply(lambda x: x.astype(str).str.upper())
df= df.drop_duplicates(subset=['sourceName'])
df_Id_map = df.set_index(['sourceName'])['Id']
return df, df_Id_map
processed = [prerprocessing(fname) for fname in filenames]
编辑:
如果你想为输入处理不同的文件类型,你可以将它作为条件添加到你的预处理函数中,例如:
def preprocessing(fname):
if fname.endswith('.csv'):
df= pd.read_csv(fname)
df= df.apply(lambda x: x.astype(str).str.upper())
df= df.drop_duplicates(subset=['sourceName'])
df_Id_map = df.set_index(['sourceName'])['Id']
elif fname.endswith('.xlsx'):
#do your things
return df, df_Id_map
我有 5 个 csv 文件要读取,但使用该 csv 文件的列名称和操作保持不变。
例如,在我的代码中,我执行以下 3 个步骤(但对所有 5 个文件都重复)
a) 我读取 csv 并将它们存储在数据框中
b) 将数据帧内容转换为大写
c) 使用子集删除重复项 = sourceName
列
d) 创建一个系列对象
test_map = pd.read_csv('test_map.csv')
test_map = test_map .apply(lambda x: x.astype(str).str.upper())
test_map = test_map .drop_duplicates(subset=['sourceName'])
test_Id_map = test_map.set_index(['sourceName'])['Id']
val_op_map = pd.read_csv('op_val_map.csv')
val_op_map = val_op_map.apply(lambda x: x.astype(str).str.upper())
val_op_map = val_op_map.drop_duplicates(subset=['sourceName'])
val_op_id_map = val_op_map.set_index(['sourceName'])['Id']
test2_map = pd.read_csv('test2_map.csv')
test2_map = test2_map.apply(lambda x: x.astype(str).str.upper())
test2_map = test2_map.drop_duplicates(subset=['sourceName'])
test2_id_map = test2_map.set_index(['sourceName'])['Id']
visit_map = pd.read_excel('visit_map.xlsx')
visit_map = visit_map.apply(lambda x: x.astype(str).str.upper())
visit_map = visit_map.drop_duplicates(subset=['sourceName'])
visit_Id_map = visit_map.set_index(['sourceName'])['Id']
demo_map = pd.read_excel('demo_map.xlsx')
demo_map = demo_map.apply(lambda x: x.astype(str).str.upper())
demo_map = demo_map.drop_duplicates(subset=['sourceName'])
demo_id_map = demo_map.set_index(['sourceName'])['Id']
我觉得针对不同的文件多次重复同一行代码既不高效也不优雅。还有其他更好的写法吗?
我最终想要输出 5 个系列对象,它们是 test_Id_map
、demo_id_map
、visit_id_map
、test2_id_map
、val_op_id_map
假设您想要一个已处理的数据帧列表及其 ID 映射,您可以这样做:
filenames = ['test_map.csv','op_val_map.csv', 'test2_map.csv','visit_map.xlsx','demo_map.xlsx']
def preprocessing(fname):
df= pd.read_csv(fname)
df= df.apply(lambda x: x.astype(str).str.upper())
df= df.drop_duplicates(subset=['sourceName'])
df_Id_map = df.set_index(['sourceName'])['Id']
return df, df_Id_map
processed = [prerprocessing(fname) for fname in filenames]
编辑: 如果你想为输入处理不同的文件类型,你可以将它作为条件添加到你的预处理函数中,例如:
def preprocessing(fname):
if fname.endswith('.csv'):
df= pd.read_csv(fname)
df= df.apply(lambda x: x.astype(str).str.upper())
df= df.drop_duplicates(subset=['sourceName'])
df_Id_map = df.set_index(['sourceName'])['Id']
elif fname.endswith('.xlsx'):
#do your things
return df, df_Id_map