簡體   English   中英

如何將多個 csv 文件合並到一個文件中,其中 pandas、python 上有特定列?

[英]How to merge multiple csv files into one file with specific columns on pandas, python?

我有 4 個不同的 csv 文件。

csv1:

ID      Fruit
1001    Apple
1002    Banana
1003    Kiwi

csv2:

ID      Color
1001    Green
1005    Red
1006    Orange
1007    Yellow

csv3:

ID      Size
1001    Large
1008    Small
1009    Medium
1010    Large

csv4:

ID      Price
1002    20
1009    40
1010    30
1011    50

這是我要制作的主 csv 文件:

Number  ID      Fruit   Color   Size    Price

1       1001    Apple   Green   Large   
2       1002    Banana                  20
3       1003    Kiwi            
4       1005            Red     
5       1006            Orange      
6       1007            Yellow      
7       1008            Small   
8       1009            Medium          40
9       1010            Large           30
10      1011                            50

我認為使用pandas會更容易做到,但我不知道Python

由於每個 csv 文件都有不同的列,我如何選擇列並將它們全部粘貼到主 csv 文件上? 如果沒有信息,我想將其設為 NULL 或 N/A 值。

您可以看到每個 csv 文件和主文件:單擊此處查看圖像

我已經花了 6 個小時,但我不知道該怎么做。

先感謝您。

reduce + combine_first

關鍵是將'ID'設置為索引,這樣我們就可以在兩個軸上獲得正確的 alignment。 我假設所有 DataFrame 都在 memory 中,但如果不是,您可以將它們讀入列表,或者在reduce步驟中進行讀取。

from functools import reduce

my_dfs = [df.set_index('ID') for df in [df1, df2, df3, df4]]
#my_dfs = [pd.read_csv(file).set_index('ID') for file in your_list_of_files]

reduce(lambda l,r: l.combine_first(r), my_dfs)

       Color   Fruit  Price    Size
ID                                 
1001   Green   Apple    NaN   Large
1002     NaN  Banana   20.0     NaN
1003     NaN    Kiwi    NaN     NaN
1005     Red     NaN    NaN     NaN
1006  Orange     NaN    NaN     NaN
1007  Yellow     NaN    NaN     NaN
1008     NaN     NaN    NaN   Small
1009     NaN     NaN   40.0  Medium
1010     NaN     NaN   30.0   Large
1011     NaN     NaN   50.0     NaN

像這樣的東西應該工作:

import pandas as pd

list_of_csv_filenames = ['csv1.csv', 'csv2.csv', 'csv3.csv', 'csv4.csv']
all_dfs = []
for i in range(1, 5):
    temp = pd.read_csv(list_of_csv_filesnames[i-1])
    temp['Number'] = i
    all_dfs.append(temp)
full_df = pd.concat(all_dfs)
full_df.to_csv('output_filename.csv', index=False)

通過三個簡單的步驟執行以下操作。

**STEP-1:導入包並設置工作目錄**

將“/mydir”更改為您想要的工作目錄。

import os
import glob
import pandas as pd
os.chdir("/mydir")

**STEP-2:使用 glob 匹配模式 'csv' **

匹配模式 ('csv') 並將文件名列表保存在 'all_filenames' 變量中。 您可以查看此鏈接以了解有關正則表達式匹配的更多信息。

extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]

第三步:合並列表中的所有文件,導出為 CSV

使用 pandas 連接列表中的所有文件並導出為 CSV。 output 文件名為“combined_csv.csv”,位於您的工作目錄中。

#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames ])
#export to csv
combined_csv.to_csv( "combined_csv.csv", index=False, encoding='utf-8-sig')

添加了 encoding = 'utf-8-sig' 以解決導出“非英語”語言時的問題。

而且……完成了!

任何一個:

fout=open("out.csv","a")
# first file:
for line in open("sh1.csv"):
    fout.write(line)
# now the rest:    
for num in range(2,201):
    f = open("sh"+str(num)+".csv")
    f.next() # skip the header
    for line in f:
         fout.write(line)
    f.close() # not really needed
fout.close()

您可以使用合並:

import pandas as pd

df1 = pd.read_csv('1.csv')
df2 = pd.read_csv('2.csv')
df3 = pd.read_csv('3.csv')
df4 = pd.read_csv('4.csv')
df = df1.merge(df2).merge(df3).merge(df4)
df.to_csv('result.csv')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM