我有这样的csv:
sku, col1, col2, test, col3, col4, col5, col6
123,456,99,A,,,,
234,786,99,,,,,
345,678,99,A,,,,
123,,,A,18-123,9999,,
234,,,,18-786,9999,,
345,,,A,12-678,9999,,
123,,,,,,18-123,9999
234,,,A,,,18-786,9999
345,,,,,,12-678,9999
这是合并3个csv后的结果(不同的标头/ sku可以在3个文件中填充不同的列。)
我的目标是“按sku分组”列,以获得taht之类的内容:
我是python的新手,所以如果这是一个琐碎的问题,请原谅,但我迷路了。
除了“ sku”列使用“主”键外,我不知道我的列名。
谢谢
答案 0 :(得分:3)
使用pandas.groupby
和first
:
df.groupby(['sku'],as_index=False).first()
sku col1 col2 test col3 col4 col5 col6
0 123 456.0 99.0 A 18-123 9999.0 18-123 9999.0
1 234 786.0 99.0 A 18-786 9999.0 18-786 9999.0
2 345 678.0 99.0 A 12-678 9999.0 12-678 9999.0
要删除.0
并使用int
转换为astype
数据类型:
df.groupby(['sku'],as_index=False).first().astype(int,errors='ignore')
sku col1 col2 test col3 col4 col5 col6
0 123 456 99 A 18-123 9999 18-123 9999
1 234 786 99 A 18-786 9999 18-786 9999
2 345 678 99 A 12-678 9999 12-678 9999
答案 1 :(得分:1)
简单的解决方案保留顺序
import csv
from collections import OrderedDict
result = OrderedDict()
with open('data.csv', 'rb') as csvfile, open("out.csv", "w") as outfile:
csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')
header = False
for row in csvreader:
if not header:
header = True
size = len(row)
sku = row[0]
existing_val = result.setdefault(sku, [''] * size)
for idx, each_val in enumerate(row):
existing_val[idx] = existing_val[idx] or each_val
csvwriter = csv.writer(outfile, delimiter=',', quotechar='"')
for each_sku, val_list in result.iteritems():
csvwriter.writerow(val_list)
答案 2 :(得分:0)
如果您可以影响csv文件的初始处理,我认为您要查找的是联接。 只需阅读所有csv文件,然后在“ sku”列上将它们结合在一起即可。 但是,它取决于您要使用的库或后端。如果您使用的是Spark或Pandas,则可以直接使用联接。如果您使用纯Python,则需要一些库或自己编写连接,如此处所述:Stackoverflow Article for Joining
答案 3 :(得分:0)
使用内置csv
和collection module
例如:
import csv
from collections import defaultdict
d = defaultdict(dict)
with open(filename, "rU") as infile:
reader = csv.DictReader(infile)
for line in reader:
d[line["sku"]].update({k.strip(): v for k,v in line.items() if v})
with open(filename1, "w") as outfile:
writer = csv.DictWriter(outfile, fieldnames=["sku", "col1", "col2", "test", "col3", "col4", "col5", "col6"])
writer.writeheader()
for k, v in d.items():
writer.writerow(v)
答案 4 :(得分:0)
可行方式:
newdf=pd.DataFrame()
newdf['sku']=df['sku'][:3]
for i in df.columns.tolist():
if i != 'sku':
newdf[i]=df[i].dropna().tolist()
print(newdf)