繁体   English   中英

如何使用 Python 和 Pandas 将具有相似和不同列的多个 CSV 文件合并为 1?

[英]How to consolidate multiple CSV files with similar and different columns into 1 using Python and Pandas?

我有 12 个 CSV 文件,我试图将它们合并到一个 CSV 文件中。 在这 12 个文件中,每一个文件中都有一列SendID SendID是唯一的,不应在最终合并的 CSV 文件中重复。 例如,我的 12 个 CSV 文件中有四个具有这些列。

(File 1: A,B,C,D,E), (File 2: A,C,F,H,K), (File 3: A,B,D,H,L), (File 4: A,D,H,N,Q)

因此,A 列存在于每个 CSV 文件中,并作为唯一的标识列或主键,不应在最终的 CSV 文件中重复。 在某些情况下,同一列可能会出现在多个 CSV 文件中,如果它们通过相同的SendID连接(或上例中列出的 A 列),这些列将在每个文件中携带相同的值。

这些文件还可能具有仅存在于单个 CSV 文件中且不存在于任何其他文件中的不同列,同样,此列将附加到SendID主键列的最终聚合行。 列中也可能有一些行,它们不会为许多 CSV 文件中的每条SendID记录携带一个值。 因此,基于唯一SendID的一行可能具有 K 列的值,但 Q 列不具有值。在这种情况下,Q 列的值将是 NULL 或该记录为空。

我如何使用 Python 和 Pandas 将这 12 个 CSV 文件转换为一个最终的SendID文件,该文件将不包含重复的记录? 同时还能够将不同文件中的所有不同列附加到SendID主键,为每个唯一的SendID记录形成一个聚合行,当然不会创建可能出现在多个 CSV 文件中的同一列的重复项。 我提前道歉,因为我知道这有点冗长,但我对 python 仍然很陌生,并且正在尝试尽可能多地学习。

假设你有这个数据框

import pandas as pd

df1 = pd.DataFrame([{'A':'1', 'B':'2'}])
df2 = pd.DataFrame([{'A':'1', 'C':'3'}, {'A':'2', 'C':'4'}])

现在,如果你想在 A 列即 SendID 的基础上合并这两个,你可以做这样的事情

df1.merge(df2, on='A', how='outer').drop_duplicates()

它将导致合并的文件,例如;

在此处输入图像描述

因此,它不会包含重复的记录。 此外,附加具有相同主键的各个列,形成唯一记录。

df1 = pd.DataFrame(columns=list('ABCDE'))
df2 = pd.DataFrame(columns=list('ACFHK'))
df3 = pd.DataFrame(columns=list('ABDHL'))
df4 = pd.DataFrame(columns=list('ADHNQ'))


df_list = [df1, df2, df3, df4]
# rename every column with subfix _1, _2, _3, _4, except the uniqueID row 'A'
for i, df in enumerate(df_list):
    subfix = i+1
    df.columns = ['A'] + (df.columns[1:] + '_%s' % subfix).tolist()

# outer merge every df, on uniqueID row 'A'
dfn = df_list[0]
for df in df_list[1:]:
    dfn = pd.merge(dfn, df, on='A', how='outer')


# find the same column name dict
obj_col = pd.Series(dfn.columns).to_frame()
obj_col['col'] = obj_col[0].str.rsplit('_', 1).str[0]

# remove the uniqueID row
cond = obj_col['col'] == 'A'
obj_col = obj_col[~cond]
obj_col = obj_col.groupby('col')[0].agg(list)
col_dict = obj_col.to_dict()
col_dict

# {'B': ['B_1', 'B_3'],
#  'C': ['C_1', 'C_2'],
#  'D': ['D_1', 'D_3', 'D_4'],
#  'E': ['E_1'],
#  'F': ['F_2'],
#  'H': ['H_2', 'H_3', 'H_4'],
#  'K': ['K_2'],
#  'L': ['L_3'],
#  'N': ['N_4'],
#  'Q': ['Q_4']}

# combine the same column's content with combine_first
for col, colums in col_dict.items():
    dfn[col] = dfn[colums[0]]
    for i in colums[1:]:
        dfn[col] = dfn[col].combine_first(dfn[i])

# result
cols = ['A'] + list(col_dict.keys())
result = dfn[cols].copy()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM