我尝试将多个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)
答案 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'