Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:按索引对csv行进行分组_Python_Csv_Group By_Grouping - Fatal编程技术网

Python:按索引对csv行进行分组

Python:按索引对csv行进行分组,python,csv,group-by,grouping,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 这是组合3个csv后

我得到了这样一个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”列的“主键”是什么


感谢使用熊猫。groupby和
首先

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
并使用
astype
转换为
int
数据类型:

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

首先使用
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
并使用
astype
转换为
int
数据类型:

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

如果您可以影响csv文件的初始处理,我认为您需要寻找的是连接。 只需读取所有csv文件,并在“sku”列中将它们连接在一起。
但是,这取决于要使用的库或后端。如果您使用的是spark或pandas之类的工具,则可以直接使用联接。如果您使用纯python,您需要一些库或自己编写连接,正如本文所述:

如果您可以影响csv文件的初始处理,我认为您需要寻找的是连接。 只需读取所有csv文件,并在“sku”列中将它们连接在一起。
但是,这取决于要使用的库或后端。如果您使用的是spark或pandas之类的工具,则可以直接使用联接。如果您使用普通python,您需要一些库或自己编写联接,正如本文所述:

使用内置
csv
收集模块

Ex:

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)

使用内置的
csv
采集模块

Ex:

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)

保序单解

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)

保序单解

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)
可行方法:

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)
可行方法:

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)

谢谢,这是一个很好(很短)的解决方案,但它为我的价值增加了.0。我试图将其强制为“对象类型”,但仍然存在。Thanks@Mitchum检查更新,如果有帮助!谢谢,但哈特这样做的原因是,在我的“真实”文件中,我得到了一些文本和其他东西,如果我把所有内容都设置为int,它就不起作用了,因为字符串和object都不起作用。但我把它留给了另一个过滤器,我只需要对int进行过滤。谢谢谢谢,这是一个很好(很短)的解决方案,但它为我的价值增加了.0。我试图将其强制为“对象类型”,但仍然存在。Thanks@Mitchum检查更新,如果有帮助!谢谢,但哈特这样做的原因是,在我的“真实”文件中,我得到了一些文本和其他东西,如果我把所有内容都设置为int,它就不起作用了,因为字符串和object都不起作用。但我把它留给了另一个过滤器,我只需要对int进行过滤。谢谢谢谢,我把所有的东西都放在这里:在第一部分,我从我所有的csv中获取所有的标题,将其写入csv,然后写入内容。我尝试与熊猫没有任何运气做它在一个镜头。谢谢谢谢,我把所有的东西都放在这里:在第一部分,我从我所有的csv中获取所有的标题,将其写入csv,然后写入内容。我尝试与熊猫没有任何运气做它在一个镜头。谢谢欢迎您,感谢您接受解决方案!欢迎并感谢您接受此解决方案!