Python 用相似的键连接行

Python 用相似的键连接行,python,python-3.x,Python,Python 3.x,我正在学习Python,但我在编程方面没有太多经验。 我正在尝试构建一个例程来导入一个CSV文件,并迭代其中有特定键的每一行,并将这些行连接到一行中 dict_of_lists.values() 示例: dict_of_lists.values() CSV文件: '0001','key1','name' '0002','key1','age' '0001','key2','name' '0002','key2','age' dict_of_lists.values() 生成的文件应为:

我正在学习Python,但我在编程方面没有太多经验。 我正在尝试构建一个例程来导入一个CSV文件,并迭代其中有特定键的每一行,并将这些行连接到一行中

dict_of_lists.values()
示例

dict_of_lists.values()
CSV文件:

'0001','key1','name'
'0002','key1','age'
'0001','key2','name'
'0002','key2','age'
dict_of_lists.values()
生成的文件应为:

['0001','key1','name','0002','key1','age']
['0001','key2','name','0002','key2','age']
dict_of_lists.values()
如何实现这一点?

阅读CSV:

import csv

with open('my_csv.txt', 'rb') as f:
    my_list = list(csv.reader(f))
dict_of_lists.values()
在这一点上,my_list可能类似于一个列表列表,例如:

[['0001', 'key1', 'name'], ['0002', 'key1', 'age'], ['0001', 'key2', 'name'], ['0002', 'key2', 'age']]
dict_of_lists.values()
创建一个dict,其中每个键[编号]来自dict中对应于键的列表,并且dict中的每个值对应于特定键的串联列表:

dict_of_lists = {}

for item in my_list:
    _, key, _ = item
    if key in dict_of_lists.keys():
        dict_of_lists[key] = dict_of_lists[key] + item
    else:
        dict_of_lists[key] = item
dict_of_lists.values()
如果您不关心列表项的顺序:

dict_of_lists.values()
输出:

dict_of_lists.values()
[['0001', 'key2', 'name', '0002', 'key2', 'age'], ['0001', 'key1', 'name', '0002', 'key1', 'age']]
[['0001', 'key1', 'name', '0002', 'key1', 'age'], ['0001', 'key2', 'name', '0002', 'key2', 'age']]
如果您关心订单:

dict_of_lists.values()
from collections import OrderedDict
OrderedDict(sorted(dict_of_lists.items())).values()
输出:

dict_of_lists.values()
[['0001', 'key2', 'name', '0002', 'key2', 'age'], ['0001', 'key1', 'name', '0002', 'key1', 'age']]
[['0001', 'key1', 'name', '0002', 'key1', 'age'], ['0001', 'key2', 'name', '0002', 'key2', 'age']]
阅读CSV:

import csv

with open('my_csv.txt', 'rb') as f:
    my_list = list(csv.reader(f))
dict_of_lists.values()
在这一点上,my_list可能类似于一个列表列表,例如:

[['0001', 'key1', 'name'], ['0002', 'key1', 'age'], ['0001', 'key2', 'name'], ['0002', 'key2', 'age']]
dict_of_lists.values()
创建一个dict,其中每个键[编号]来自dict中对应于键的列表,并且dict中的每个值对应于特定键的串联列表:

dict_of_lists = {}

for item in my_list:
    _, key, _ = item
    if key in dict_of_lists.keys():
        dict_of_lists[key] = dict_of_lists[key] + item
    else:
        dict_of_lists[key] = item
dict_of_lists.values()
如果您不关心列表项的顺序:

dict_of_lists.values()
输出:

dict_of_lists.values()
[['0001', 'key2', 'name', '0002', 'key2', 'age'], ['0001', 'key1', 'name', '0002', 'key1', 'age']]
[['0001', 'key1', 'name', '0002', 'key1', 'age'], ['0001', 'key2', 'name', '0002', 'key2', 'age']]
如果您关心订单:

dict_of_lists.values()
from collections import OrderedDict
OrderedDict(sorted(dict_of_lists.items())).values()
输出:

dict_of_lists.values()
[['0001', 'key2', 'name', '0002', 'key2', 'age'], ['0001', 'key1', 'name', '0002', 'key1', 'age']]
[['0001', 'key1', 'name', '0002', 'key1', 'age'], ['0001', 'key2', 'name', '0002', 'key2', 'age']]

如果您能够在RAM中存储所有条目,那么使用defaultdict按键创建条目的“bucket”将是一种方法(假设文件名为“file.csv”):

dict_of_lists.values()
此程序的输入输出为:

dict_of_lists.values()
[["'0001'", "'key1'", "'name'", "'0002'", "'key1'", "'age'"],
 ["'0001'", "'key2'", "'name'", "'0002'", "'key2'", "'age'"]]
缺少的只是为每个条目去掉单引号(并且可能根据您的喜好格式化输出,而不仅仅是使用
pprint()
)。如果您可以保证您的输入格式正确,并且字段始终具有单引号(或者更准确地说,条目中每个字段的第一个和最后一个字符永远不相关),您可以通过在
key=entry[1]
行上方添加以下内容来实现:

dict_of_lists.values()
entry = [field[1:-1] for field in entry]

这将去除每个字段的第一个和最后一个字符。

如果您能够将所有条目存储在RAM中,那么使用defaultdict按键创建条目的“bucket”将是一种方法(假设文件名为“file.csv”):

dict_of_lists.values()
此程序的输入输出为:

dict_of_lists.values()
[["'0001'", "'key1'", "'name'", "'0002'", "'key1'", "'age'"],
 ["'0001'", "'key2'", "'name'", "'0002'", "'key2'", "'age'"]]
缺少的只是为每个条目去掉单引号(并且可能根据您的喜好格式化输出,而不仅仅是使用
pprint()
)。如果您可以保证您的输入格式正确,并且字段始终具有单引号(或者更准确地说,条目中每个字段的第一个和最后一个字符永远不相关),您可以通过在
key=entry[1]
行上方添加以下内容来实现:

dict_of_lists.values()
entry = [field[1:-1] for field in entry]

这将去除每个字段的第一个和最后一个字符。

假设您的csv文件不包含单引号(这些单引号仅用于此处演示),这应该可以:

dict_of_lists.values()
import pandas as pd
Data = pd.read_csv('Test.csv',header=None,dtype=str)
Result = Data.groupby(1).apply(lambda y: ','.join([s1 for s2 in y.values for s1 in s2]))
f = open('Result.csv','w')
for r in Result:
   f.write(r+'\n') 
f.close() 

输出存储在Result.csv

中,假设您的csv文件不包含单引号(并且这些单引号仅用于此处的演示),这应该可以工作:

dict_of_lists.values()
import pandas as pd
Data = pd.read_csv('Test.csv',header=None,dtype=str)
Result = Data.groupby(1).apply(lambda y: ','.join([s1 for s2 in y.values for s1 in s2]))
f = open('Result.csv','w')
for r in Result:
   f.write(r+'\n') 
f.close() 
输出存储在Result.csv中

dict_of_lists.values()