簡體   English   中英

將具有不同標題的 csv 文件與 Python 中的 Pandas 合並

[英]Merging csv files with different headers with Pandas in Python

我正在嘗試將數據集映射到具有不同標題的空白 CSV 文件,因此我實際上是在嘗試將數據從一個具有不同標題的 CSV 文件映射到具有不同標題數量並稱為不同內容的新 CSV,原因這個問題是不同的,因為列名不一樣,但也沒有重疊的列。 而且我不能用新的標題覆蓋數據文件,因為數據文件有其他列包含不相關的數據,我確定我把它復雜化了。

我已經看過這個示例代碼,但是我如何更改它,因為這個示例使用一個公共頭來連接數據。

a = pd.read_csv("a.csv")
b = pd.read_csv("b.csv")
#a.csv = ID TITLE
#b.csv = ID NAME
b = b.dropna(axis=1)
merged = a.merge(b, on='title')
merged.to_csv("output.csv", index=False)

樣本數據

a.csv(空白格式文件,格式必須與此文件匹配):

Headers: TOWN NAME LOCATION HEIGHT STAR

b.csv:

Headers: COUNTRY WEIGHT  NAME  AGE MEASUREMENT
 Data:    UK,     150lbs, John, 6,  6ft

預期輸出文件:

Headers: TOWN    NAME   LOCATION  HEIGHT  STAR
Data:    (Blank) John,  UK,       6ft    (Blank)

從您的示例來看,除了merge之外,您似乎還需要進行一些列重命名。 這是在merge之前最容易完成的。

# Read the csv files
dfA = pd.read_csv("a.csv")
dfB = pd.read_csv("b.csv")

# Rename the columns of b.csv that should match the ones in a.csv
dfB = dfB.rename(columns={'MEASUREMENT': 'HEIGHT', 'COUNTRY': 'LOCATION'})

# Merge on all common columns
df = pd.merge(dfA, dfB, on=list(set(dfA.columns) & set(dfB.columns)), how='outer')

# Only keep the columns that exists in a.csv
df = df[dfA.columns]

# Save to a new csv
df.to_csv("output.csv", index=False)

這應該給你你所追求的。

您應該為數據框指定 left_on 列,為 b 數據框指定 right_on 列。 因此,您在 a 上具有帶有標題“data_1”的通用數據類型和帶有標題“data_2”的 b 中的通用數據。 如果您不使用簡單的 a['series_1'] = [i for i in range(a.shape[0])] 和 for b ==> b['series_1] = [i for我在范圍內(b.shape[0])。 現在你有一個共同的專欄。 如果不是,您可以使用 a.merge(b,left_on='a_column',right_on='b_column') 這將起作用。 您可以將 reset_index() 用於公共列。 使用 a = a.reset_index() 將創建一個從 1 到 a.shape[0] 的索引並將其用於 b = b.reset_index()。 merge() 函數自動理解具有相同標頭的常見數據類型。

這是使用df.reindex添加空列而不是merge另一種方法。

import pandas as pd

dfa = pd.read_csv('./a.csv')
dfb = pd.read_csv('./b.csv')

# These columns will be renamed.
colmap = {'COUNTRY': 'LOCATION', 'MEASUREMENT': 'HEIGHT'}
# Extract all unique column names.
cols = list(set(dfa.columns.tolist() + dfb.columns.tolist()))
# Create a new dataset matching requirements.
dfb = dfb.rename(columns=colmap).reindex(columns=cols)[dfa.columns]
# Write to CSV.
dfb.to_csv('output.csv', index=False)

輸出:

從控制台顯示的 CSV 內容...

(py35) user@host ~/Desktop/so
$ cat output.csv 

TOWN,NAME,LOCATION,HEIGHT,STAR
,John,UK,6ft

源文件:

從控制台顯示的源 CSV 文件的內容...

(py35) user@host ~/Desktop/so
$ cat a.csv 

TOWN,NAME,LOCATION,HEIGHT,STAR

(py35) user@host ~/Desktop/so
$ cat b.csv 

COUNTRY,WEIGHT,NAME,AGE,MEASUREMENT
UK,150lbs,John,6,6ft

暫無
暫無

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

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