![](/img/trans.png)
[英]Python/Pandas: How to consolidate repeated rows with NaN in different columns?
[英]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 仍然很陌生,并且正在尝试尽可能多地学习。
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.