【问题标题】:Elegant way to read multiple csv files and convert them to series objects读取多个 csv 文件并将它们转换为系列对象的优雅方式
【发布时间】:2021-04-15 03:05:36
【问题描述】:

我有 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_mapdemo_id_mapvisit_id_maptest2_id_mapval_op_id_map

【问题讨论】:

  • 您应该定义一个执行转换的函数,然后在遍历每个 csv 文件时使用该函数。

标签: python pandas function dataframe memory-efficient


【解决方案1】:

假设您想要一个已处理数据帧的列表及其 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

【讨论】:

  • 谢谢,点赞。但是csv和excel文件很少
  • 你可以编辑你的预处理函数来处理你想要的任何文件类型。
猜你喜欢
  • 1970-01-01
  • 2019-07-27
  • 2012-03-15
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2014-01-27
相关资源
最近更新 更多