【问题标题】:Merge files with a for loop使用 for 循环合并文件
【发布时间】:2021-12-25 05:04:13
【问题描述】:

我在一个文件夹中有两千多个 csv 文件,如下所示:

University_2010_USA.csv, University_2011_USA.csv, Education_2012_USA.csv, Education_2012_Mexico.csv, Education_2012_Argentina.csv,

Results_2010_USA.csv, Results_2011_USA.csv, Results_2012_USA.csv, Results_2012_Mexico.csv, Results_2012_Argentina.csv,

我想根据文件名中的“年份”(2012 等)和“国家”(墨西哥等)将列表中的第一个 csv 文件与第二个匹配。有没有办法这么快?两个 csv 文件具有相同的列名,我正在查看以下代码:

df0 = pd.read_csv('University_2010_USA.csv')
df1 = pd.read_csv('Results_2010_USA.csv')
new_df = pd.merge(df0, df1, on=['year','country','region','sociodemographics'])

所以基本上,我需要帮助来编写一个遍历数据集的 for 循环...谢谢!

【问题讨论】:

  • mabye 使用University 获取所有名称并将单词University 替换为Results,您将获得匹配的文件名。或用* 替换第一个单词以运行glob.glob("*_2012_USA.csv") 之类的行以匹配具有相同年份和国家/地区的所有文件。
  • 为什么Education_2012_Mexico.csv 出现在两个列表中?是否有规则将哪个文件转到哪个数据帧(df0 或 df1)?

标签: python pandas for-loop dataset


【解决方案1】:

试试这个:

from pathlib import Path

university = []
results = []
for file in Path('/path/to/data/folder').glob('*.csv'):
    # Determine the properties from the file's name
    file_type, year, country = file.stem.split('_')
    if file_type not in ['University', 'Result']:
        continue

    # Make the data frame, with 2 extra columns using properties
    # we extracted from the file's name
    tmp = pd.read_csv(file).assign(
        year=int(year),
        country=country
    )
    if file_type == 'University':
        university.append(tmp)
    else:
        results.append(tmp)

df = pd.merge(
    pd.concat(university),
    pd.concat(results),
    on=['year','country','region','sociodemographics']
)

【讨论】:

  • tmp = pd.read_csv(tmp).(#more code) ... 好像你的意思是tmp = pd.read_csv(file).(#more code)
  • 当然,需要 OP 提供更多详细信息;我知道文件名开头的字符串是无关紧要的(您的代码会错误地丢弃任何以不等于UniversityResults 的字符串开头的文件——在OP 中,还有以@ 开头的示例文件987654326@(据我了解)OP 也想阅读)。
  • 我明白哪个文件去df_a与哪个去df_b之间的区别是/文件夹/文件所在的位置;文件夹A中的文件进入df_a,文件夹B中的文件进入df_b(尽管OP没有明确定义所需的输出数据结构——两个DataFrames?两个DataFrames列表?DataFrames的字典?还有别的吗?)
  • @JoshuaVoskamp 也许我不应该在喝几杯啤酒后编码。无论如何,这个问题并不清楚,因为我不知道哪个文件(Univeristy*Education*Results*)去哪个列表
猜你喜欢
  • 2017-04-30
  • 2019-10-30
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多