python - 根据第一个列键合并csv中的重复行
问题描述
我尝试合并 3 个具有不同结构但常见字段的 csv。我正在使用熊猫来做到这一点。
我有3个这样的csv:
csv1
sku;col1;col2;test
123;456;99;A
234;786;99;
345;678;99;A
csv2
sku;col3;col4;test
123;18-123;9999;A
234;18-786;9999;
345;12-678;9999;A
csv3
sku;col5;col6;test
123;18-123;9999;
234;18-786;9999;A
345;12-678;9999;
我的脚本是这样的:
#!/usr/bin/env python
import pandas as pd
import numpy as np
from functools import reduce
a = pd.read_csv("csv1.csv",sep =';', low_memory=False)
b = pd.read_csv("csv2.csv",sep =';', low_memory=False)
a = a.astype('object')
b = b.astype('object')
val = np.intersect1d(a.columns, b.columns).tolist()
merged = a.merge(b, on=val, how='outer')
merged.to_csv("csv1_2.csv",sep=';', index=False)
c = pd.read_csv("csv1_2.csv",sep =';', low_memory=False)
c = c.astype('object')
d = pd.read_csv("csv3.csv",sep =';', low_memory=False)
d = d.astype('object')
val = np.intersect1d(c.columns, d.columns).tolist()
merged = c.merge(d, on=val, how='outer')
merged.to_csv("csv1_2_3.csv",sep=';', index=False)
当我得到这样的合并 csv 时,它正在醒来:
sku;col1;col2;test;col3;col4;col5;col6
123;456;99;A;18-123;9999;;
234;786;99;A;18-786;9999;18-786;9999
345;678;99;A;12-678;9999;;
123;;;;;;18-123;9999
345;;;;;;12-678;9999
但是有“重复的行”,我想用相同的sku“合并”行以获得最终的csv
sku;col1;col2;test;col3;col4;col5;col6
123;456;99;A;18-123;9999;18-123;9999
234;786;99;A;18-786;9999;18-786;9999
345;678;99;A;12-678;9999;12-678;9999
您对按 sku “合并”行旁边的操作有任何提示吗?谢谢
解决方案
利用pd.concat()
df = pd.concat([pd.read_csv(x, sep=';', index_col='sku')
...: for x in ['csv1', 'csv2', 'csv3']], axis=1)
df.loc[:,~df.columns.duplicated()]
col1 col2 test col3 col4 col5 col6
sku
123 456 99 A 18-123 9999 18-123 9999
234 786 99 A 18-786 9999 18-786 9999
345 678 99 A 12-678 9999 12-678 9999
推荐阅读
- windows - 批处理文件 - 当前工作目录干扰环境变量 CD
- reactjs - React Stripe 结帐多个行项目
- google-apps-script - 如何通过谷歌应用脚本在一个单元格中应用多个数据验证规则?
- python - 不同类别的堆积条形图颜色
- python - 按 id 分组并根据日期计算销售变化
- python - 我试图将 Python 添加到 VSCode,但它不起作用
- python - 通过混合 AND 和 OR 使用 str.contains 识别子字符串
- android - Android:如果用户没有完成注册,他仍然可以进入 MainActivity
- php - 遇到PHP错误,我自己无法调试
- php - 在 Symfony 5 中使用带有标记的 Redis