Python:按索引将csv分组

时间:2018-08-30 06:42:57

标签: python csv group-by grouping

我有这样的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

enter image description here

这是合并3个csv后的结果(不同的标头/ sku可以在3个文件中填充不同的列。)

我的目标是“按sku分组”列,以获得taht之类的内容:

enter image description here

我是python的新手,所以如果这是一个琐碎的问题,请原谅,但我迷路了。

除了“ sku”列使用“主”键外,我不知道我的列名。

谢谢

5 个答案:

答案 0 :(得分:3)

使用pandas.groupbyfirst

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)

使用内置csvcollection 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)