【问题标题】:Pandas: Any ideas on how to load data in pandas dataframe熊猫:关于如何在熊猫数据框中加载数据的任何想法
【发布时间】:2021-05-31 14:21:58
【问题描述】:

大家好,我是熊猫新手,

我有多个类似这样的 CSV 文件:

john_age.csv
john_gender.csv
john_weight.csv
mike_age.csv
mike_gender.csv
mike_weight.csv
smith_age.csv
smith_gender.csv
smith_weight.csv
...
...

每个 csv 文件都有一个简单的单个字符串或数字,如下所示:

john_age.csv       54
john_gender.csv    male
john_weight.csv    65.4

基本上,我想让整个数据框看起来像这样:

        age    gender    weight      
john     54     male      65.4
mike     23     male      86.5
smith    52     female    54

我怎样才能做到这一点?


我认为关键思想是将每个 csv 文件名合并到数据帧中,但到目前为止,我只设法使用 glob.glob 和 append 函数读取多个 csv 文件,但 append 函数不是解决方案:

csv_path = \mypath\  

filenames = glob.glob(csv_path + '\*.csv')

dfs= []

for file in filenames:
    dfs.append(pd.read_csv(file)) 

提前非常感谢!!

【问题讨论】:

  • 你真的是说每个 CSV 文件里都有一条信息吗?这是一种非常奇怪的存储方式。您应该将所有这些文件合并到一个 CSV 文件中,其中包含 john,54,male,65.4mike,23,male,86.5 等行。这样可以轻松导入数据框。
  • @TimRoberts 是的,数据是通过 OCR(光学字符识别)库获取的,不知何故我只能设法以这种方式提取。感谢您的帮助和洞察力!

标签: python pandas dataframe csv glob


【解决方案1】:

这就是我所说的:

with open('combined.csv','w') as combine:
    for fn in glob.glob(csv_path+'\*_age.csv'):
        name = os.path.basename(f).split('_')[0]
        fields = [name]
        for part in ('age','gender','weight'):
            fields.append( open(f"{cvs_path}\{name}_{part}.csv").read().strip() )
        print( ','.join(fields), file=combine )

dfs = pd.read_cvs('combined.csv')

【讨论】:

    【解决方案2】:

    这将从文件中创建一个数据框。

    import glob
    import pandas as pd
    
    csv_path = 'csvs'  
    
    filenames = glob.glob(csv_path + r'\*_age.csv')
    
    people = []
    attrs =['age', 'gender', 'weight']
    
    for file in filenames:
        person = {}
        name = file[5:].split('_')[0]
        print(name)
        for attr in attrs:
            person['name'] = name
            with open(f'{csv_path}\{name}_{attr}.csv', 'r') as data_file:
                data = data_file.readline() 
                person[attr] = data
        people.append(person)
        
    df = pd.DataFrame(people)
    
    print(df)
    

    【讨论】:

      【解决方案3】:

      您可以使用pd.concat() 在一行中完成此操作

      from glob import glob
      import pandas as pd
      
      files = glob(“path/to/files/*.csv”)
      files.sort()
      
      data = pd.concat((pd.read_csv(file) for file in files), ignore_index=True, header=0, names=[“age”, “gender”, “weight”])
      

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2015-03-11
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2021-11-09
        相关资源
        最近更新 更多