使用熊猫合并成千上万个csv文件

时间:2019-07-16 09:31:50

标签: python loops csv merge

我尝试将多个csv文件合并为一个,且没有重复的类似列。

例如: 1file.csv

date           val      
2019-05-07     10.2
2019-05-06     10.1
2019-05-05     10.1
2019-05-04     10.0
2019-05-03     9.8
2019-05-02     10.1

2file.csv

date           val      
2019-05-07     3.2
2019-05-06     3.1
2019-05-04     3.24
2019-05-02     3.5 

3file.csv

date           val      
2019-05-06     5.1
2019-05-05     5.12
2019-05-03     5.83
2019-05-02     5.15    

merge.csv

date           val1   val2  val3
2019-05-07     10.2   3.2   null
2019-05-06     10.1   3.1   5.1
2019-05-05     10.1   null  5.12
2019-05-04     10.0   3.24  null
2019-05-03     9.8    null  5.83
2019-05-02     10.1   3.5   5.15

我期望的最终结果是这样的。

result.csv

date           val1   val2  val3
2019-05-06     10.1   3.1   5.1
2019-05-02     10.1   3.5   5.15

我想要这样的东西,任何人都可以帮助我。

我尝试循环所有csv文件的一些代码,但是我不知道如何将所有csv文件合并到一个文件中。

file_path = '/Users/Desktop/P/*.csv'
for filename in glob(file_path):

    df = pd.read_csv(filename, header=0, sep=',', parse_dates= ["date"], encoding='utf-8',usecols= ['date', 'val'])
    print(df)

2 个答案:

答案 0 :(得分:1)

一种方法是使用outer方法合并所有数据框,例如保留两个数据集中的所有数据。最后,您拥有与提供的“ merge.csv”相同的数据集。

您拥有一个此数据集,您可以使用不包含空值的这些数据过滤行:

假设您具有以下数据集:

print(df1)
#          date   val
# 0  2019-05-07  10.2
# 1  2019-05-06  10.1
# 2  2019-05-05  10.1
# 3  2019-05-04  10.0
# 4  2019-05-03   9.8
# 5  2019-05-02  10.1
print(df2)
#          date   val
# 0  2019-05-07   3.2
# 1  2019-05-06   3.1
# 2  2019-05-04  3.24
# 3  2019-05-02   3.5
print(df3)
#          date   val
# 0  2019-05-06   5.1
# 1  2019-05-05  5.12
# 2  2019-05-03  5.83
# 3  2019-05-02  5.15

您可以将它们合并:

output_df = df1
output_df = output_df.merge(df2, on="date", how="outer", suffixes=["", "_2"])
output_df = output_df.merge(df3, on="date", how="outer", suffixes=["", "_3"])
print(output_df)
#          date   val val_2 val_3
# 0  2019-05-07  10.2   3.2   NaN
# 1  2019-05-06  10.1   3.1   5.1
# 2  2019-05-05  10.1   NaN  5.12
# 3  2019-05-04  10.0  3.24   NaN
# 4  2019-05-03   9.8   NaN  5.83
# 5  2019-05-02  10.1   3.5  5.15

并最终过滤没有缺失值的行:

output_df = output_df.loc[~output_df.isnull().any(axis=1)]
print(output_df)
#          date   val val_2 val_3
# 1  2019-05-06  10.1   3.1   5.1
# 5  2019-05-02  10.1   3.5  5.15

我让您通过for循环来适应它!

答案 1 :(得分:0)

这里是4个文件的代码,但是,如果它们确实是数千个,那么您就麻烦了。

import pandas as pd

merge = pd.read_csv('1file.csv', names=['date', 'val'], header=0)
for i in range(2, 5):
    filename = f'{i}file.csv'
    colname = f'val{i}'
    df = pd.read_csv(filename, names=['date', colname], header=0)
    merge = pd.merge(merge, df, on='date', how='outer')

print(merge.head())

#          date   val  val2  val3  val4
# 0  2019-05-07  10.2  10.2  10.2  10.2
# 1  2019-05-06  10.1  10.1  10.1  10.1
# 2  2019-05-05  10.1   NaN  10.1  10.1
# 3  2019-05-04  10.0   NaN  10.0  10.0
# 4  2019-05-03   9.8   9.8   9.8   9.8

,如果只希望没有NaN的行,则仅使用how='inner'而不是how='outer'