我有一个csv文件,它有一个primary_id字段和一个version字段,看起来如下所示:
ful_id version xs at_grade date
000c1a6c-1f1c-45a6-a70d-f3555f7dd980 3 123 yes 20171003
000c1a6c-1f1c-45a6-a70d-f3555f7dd980 1 12 no 20170206
034c1a6c-4f1c-aa36-a70d-f2245f7rr342 1 334 yes 20150302
00dc5fec-ddb8-45fa-9c86-77e09ff590a9 1 556 yes 20170201
000c1a6c-1f1c-45a6-a70d-f3555f7dd980 2 123 no 20170206编辑这是实际数据的样子,加上增加了106列数据和20,000条记录
较大的版本号是该记录的最新版本。我很难想出基于版本的最新记录的逻辑,并将其转储到字典中。我正在将csv中的信息提取到一个空白列表中,但如果有人能给我一些关于继续前进的逻辑的指导,我将不胜感激。
import csv
from collections import defaultdict
reader = csv.DictReader(open('rpm_inv.csv', 'rb'))
allData = list(reader)
dict_list = []
for line in allData:
dict_list.append(line)
pprint.pprint(dict_list)发布于 2018-02-22 21:00:26
不需要任何花哨的东西。
defaultdict包含在Python的标准库中。这是一本改进过的字典。我之所以在这里使用它,是因为它避免了在字典中初始化条目的需要。这意味着我可以编写,例如,result[id] = max(result[id], version)。如果id不存在条目,那么defaultdict将创建一个条目并将version放入其中(因为很明显,这将是最大的)。map将int函数应用于每个生成的字符串。ignore的变量。>>> from collections import defaultdict
>>> result = defaultdict(int)
>>> with open('to_dict.txt') as input:
... ignore = input.readline()
... for line in input:
... id, version = map(int, line.strip().replace(' ', '').split(','))
... result[id] = max(result[id], version)
...
>>> ids = list(result.keys())
>>> ids.sort()
>>> for id in ids:
... id, result[id]
...
(3, 1)
(11, 3)
(20, 2)
(400, 2)编辑:有了这么多数据,在我看来,更好地处理熊猫就成了一个不同的问题。
我使用了df.groupby(['ful_id']).version.idxmax()位来演示我所做的事情。我在ful_id上分组,然后请求version的最大值和最大值的索引,这都是在一个步骤中使用idxmax的。虽然熊猫将其显示为两列表,但其结果实际上是一个整数列表,我可以使用它从dataframe中选择行。
这就是我对df.iloc[df.groupby(['ful_id']).version.idxmax(),:]所做的。在这里,df.groupby(['ful_id']).version.idxmax()部分标识行,:部分标识列,即所有列。
谢谢你提出一个有趣的问题!
>>> import pandas as pd
>>> df = pd.read_csv('different.csv', sep='\s+')
>>> df
ful_id version xs at_grade date
0 000c1a6c-1f1c-45a6-a70d-f3555f7dd980 3 123 yes 20171003
1 000c1a6c-1f1c-45a6-a70d-f3555f7dd980 1 12 no 20170206
2 034c1a6c-4f1c-aa36-a70d-f2245f7rr342 1 334 yes 20150302
3 00dc5fec-ddb8-45fa-9c86-77e09ff590a9 1 556 yes 20170201
4 000c1a6c-1f1c-45a6-a70d-f3555f7dd980 2 123 no 20170206
>>> df.groupby(['ful_id']).version.idxmax()
ful_id
000c1a6c-1f1c-45a6-a70d-f3555f7dd980 0
00dc5fec-ddb8-45fa-9c86-77e09ff590a9 3
034c1a6c-4f1c-aa36-a70d-f2245f7rr342 2
Name: version, dtype: int64
>>> new_df = df.iloc[df.groupby(['ful_id']).version.idxmax(),:]
>>> new_df
ful_id version xs at_grade date
0 000c1a6c-1f1c-45a6-a70d-f3555f7dd980 3 123 yes 20171003
3 00dc5fec-ddb8-45fa-9c86-77e09ff590a9 1 556 yes 20170201
2 034c1a6c-4f1c-aa36-a70d-f2245f7rr342 1 334 yes 20150302发布于 2018-02-22 20:33:52
我不太清楚您希望您的输出是什么样子,但这可能至少指向正确的方向,只要您不反对pandas。
import pandas as pd
df = pd.read_csv('rpm_inv.csv', header=True)
by_version = df.groupby('Version')
latest = by_version.max()
# To put it into a dictionary of {version:ID}
{v:row['ID'] for v, row in latest.iterrows()}https://stackoverflow.com/questions/48936649
复制相似问题