【问题标题】:Merging csv files with different headers with Pandas in Python在 Python 中将具有不同标题的 csv 文件与 Pandas 合并
【发布时间】:2020-06-24 06:53:31
【问题描述】:

我正在尝试将数据集映射到具有不同标头的空白 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)

【问题讨论】:

  • 您可以在示例数据中添加您的预期输出吗?
  • @Datanovice 示例数据是底部,a.csv 只有标题(我需要的文件格式),b.csv 是具有不同标题的数据,我需要获取并映射到.csv,

标签: python pandas csv dataframe


【解决方案1】:

您应该为数据框指定 left_on 列,为 b 数据框指定 right_on 列。因此,您在 a 上具有标头“data_1”的通用数据类型,在 b 中具有标头“data_2”的通用数据。如果您不使用简单的 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() 函数自动理解具有相同标头的常见数据类型。

【讨论】:

  • 请您扩展一下好吗?
【解决方案2】:

从您的示例看来,除了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)

这应该会给你你所追求的。

【讨论】:

    【解决方案3】:

    这是使用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
    

    【讨论】:

    • @MFDOOM - 也许再试一次。我自己运行了这个,内容就在那里。我已更新答案以显示从控制台运行的 cat 命令,显示 CSV 的内容。我还添加了源文件的内容。
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2013-04-15
    • 1970-01-01
    • 2020-03-29
    • 2021-06-15
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多