【问题标题】:Concat list of dataframes in pandas not working because the list is too long熊猫中的数据帧的连续列表不起作用,因为列表太长
【发布时间】:2021-07-09 20:28:55
【问题描述】:

我正在导入大量 JSON 文件。它们每年来自一个文件夹。 文件已正确导入,并作为数据框存储在列表中。我的计划是连接列表并每年导出为一个 CSV。问题是连接不起作用,因为 df 列表太长(当我尝试使用少量文件时它起作用)。我想我应该找到一种方法为每个文件夹制作一个列表,以便连接每个列表然后导出,或者找到一种方法只连接列表中具有相同年份的 df(每个 df 都有一个带有年份的列价值)。我两个都做不到,所以我需要帮助。

我的代码如下所示:

os.chdir('C:\\Users\\User\\Documents\\Local\\hs')  
rootdir = 'C:\\Users\\User\\Documents\\Local\\hs'

data_df = []
files_notloading=[]
for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print(os.path.join(subdir, file))
        if 'json' in os.path.join(subdir, file):
            try:
                with open(os.path.join(subdir, file),'r') as f:
                    data = json.loads(f.read())
                    if not data['search']:
                        data['search'] = [{'R': 0}]
            # Normalizing data
                df = pd.json_normalize(data, record_path =['search'],
                                   meta =['month', 'type',
                                          'day','year'],errors='ignore')
                data_df.append(df)
            except: files_notloading.append(file)

data_df = pd.concat(data_df)
files_notloading = pd.DataFrame(files_notloading)

for year in data_df['year'].unique():
    file_name = '/Users/User/Documents/data/hs_{0}.csv'.format(year) 
    data_df[data_df['year'] == year].to_csv(file_name, index= False)
    
files_notloading.to_csv(path_or_buf='/Users/User/Documents/data/filesnotloading_hs.csv',index= False)

【问题讨论】:

  • 查看这个关于连接大量数据帧的答案。本质上,解决方法是将数据帧的子集连接成更大的数据帧,然后将更大的数据帧连接成最终的:stackoverflow.com/a/40568957/5992438

标签: python pandas list dataframe concatenation


【解决方案1】:

我能够找到一种方法为每个文件夹制作一个列表,以便连接每个列表然后导出。

代码:

import os
import pandas as pd
import json
import os.path
import os

os.chdir('C:\\Users\\User\\Documents\\Local\\hs')  
working_dir = "C:\\Users\\User\\Documents\\Local\\hs"
output_dir = "C:\\Users\\User\\Documents\\Local\\hs"

files_notloading=[]
for root, dirs, files in os.walk(working_dir):
    file_list = []
    df_list=[]
    for filename in files:
        print(os.path.join(root,filename))
        if filename.endswith('.json'):
            file_list.append(os.path.join(root, filename))
    for file in file_list:
        try:
            with open(file,'r') as f:
                data = json.loads(f.read())
                if not data['search']:
                    data['search'] = [{'R': 0}]
                df = pd.json_normalize(data, record_path =['search'],
                                       meta =['month','type', 'day','year'],errors='ignore')
                df_list.append(df)
        except: files_notloading.append(file)
    if df_list:
        final_df = pd.concat(df_list)
        final_file = 'hs_{0}.csv'.format(final_df['year'].iloc[0])
        final_df.to_csv(os.path.join(output_dir, final_file),index=False)

files_notloading = pd.DataFrame(files_notloading,columns =['file'])
files_notloading.to_csv(os.path.join(output_dir, 'hs_files_notloading.csv'),index= False)

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 2017-05-04
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2014-12-04
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多