【问题标题】:Merge dataframes via columnwise in a directory with common columns在具有公共列的目录中按列合并数据框
【发布时间】:2020-02-06 15:53:22
【问题描述】:

我正在尝试将多个 .txt 文件合并到一个目录中,该目录专门合并到数据框中的公共列 X 之一。

import pandas as pd

  df1 = pd.DataFrame({'X': ['X0', 'X1', 'X2', 'X3'],
       ...:                     'B': ['B0', 'B1', 'B2', 'B3'],
       ...:                     'C': ['C0', 'C1', 'C2', 'C3'],
       ...:                     'D': ['D0', 'D1', 'D2', 'D3']})


 df2 = pd.DataFrame({'X': ['X0', 'X1', 'X2', 'X3'],
   ...:                     'G': ['G0', 'G1', 'G2', 'G3'],
   ...:                     'H': ['H0', 'H1', 'H2', 'H3'],
   ...:                     'J': ['J0', 'J1', 'J2', 'J3']})

通过关注之前的这篇文章 Pandas Merging 101 还有这个https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

我试过了

data = pd.DataFrame()
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    df=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    data=pd.concat([data,df])

data_merge = pd.merge(data,on='X',how='inner')

但我得到了

TypeError: merge() 缺少 1 个必需的位置参数:'right'

如何通过共同的X 列加入两个数据名?

预期输出

谢谢。

【问题讨论】:

  • 您可以将pd.merge 与:df1.merge(df2, on='X')pd.merge(df1, df2, on='X') 一起使用,它们是一样的

标签: python pandas dataframe merge


【解决方案1】:

concat 就够了,你不需要merge。执行data = [],将文件读入数据帧,将它们附加到dataconcat 一次:

data = []
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    df=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    data.append(df.set_index('X'))

data_merge = pd.concat(data, axis=1)

这假定您的 X 列在所有数据框中都不包含重复项。否则,您需要在没有concat 的情况下在for 循环内执行迭代merge,类似于:

final_df = None
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    df=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    if final_df is not None:
        final_df = final_df.merge(df, on='X', how='outer')
    else: 
        final_df = df

【讨论】:

  • 如果我有多个常用列,如 ['Z', 'Q', 'W']
  • merge 在加入选项方面比concat 更灵活。
  • set_index(['Z','Q','W']) 而不是 set_index('X')。您也可以将index_cols=['Z','Q','W'] 传递给read_csv 而忘记set_index
  • if final_df is not None: 在这里做什么?检查数据文件是否为空?
  • 它检查这是否是第一个文件。您也可以执行final_df = pd.DataFrame(columns='X') 并摆脱if 检查。
【解决方案2】:

您没有包含要合并的正确数据框,因为您只在合并调用需要两个数据框时才给它一个数据框。尝试: pd.merge(df1, df2, on="X")

编辑:

dataframe_list = []
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    data=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    dataframe_list.append(data)

data_merge = pd.merge(dataframe_list[0], dataframe_list[1], on='X',how='inner')

编辑2,多于两个数据框:

dataframe_list = []
for file in glob.iglob(filepath + '/*.txt', recursive=True):

    print(file)

    data=pd.read_csv(file, sep ='\t',header=0, skiprows=0, skipfooter=0, na_values=(""," ","NA"))
    dataframe_list.append(data)

    if len(dataframe_list) ==2:
        data_merge = pd.merge(dataframe_list[0], dataframe_list[1], on='X')
        dataframe_list = [data_merge]
dataframe = dataframe_list[0]

【讨论】:

  • 不能这样做。一切都在一个 for 循环中。请仔细检查OP。
  • 在这种情况下,我会创建一个数据框列表,用每个文件中的数据填充它,然后合并列表的内容,如下所示:
  • 您能提供解决方案吗?
  • 如果文件夹中有 100 个文件怎么办?我们需要做 dataframe_list[0], dataframe_list[1], dataframe_list[2], dataframe_list[3]....dataframe_list[99] ?
  • 感谢您的解决方案。真的很有帮助!
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多