通过Python根据记录的版本遍历csv记录

2024-04-25 20:49:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,它有一个primary\u 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列数据和20000条记录

较大的版本号是该记录的最新版本。我很难思考根据版本获取最新记录并将其转储到词典中的逻辑。我正在将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)

Tags: csv数据noimport版本idversion记录
2条回答

不需要任何花哨的东西。你知道吗

  • defaultdict包含在Python的标准库中。这是一本改进过的词典。我在这里使用它是因为它避免了在字典中初始化条目的需要。这意味着我可以写,例如result[id] = max(result[id], version)。如果id没有条目,那么defaultdict创建一个条目并将version放入其中(因为很明显这将是最大值)。你知道吗
  • 我阅读输入文件中的行,一次一行,丢弃结束行和空格,拆分逗号,然后使用mapint函数应用于生成的每个字符串。你知道吗
  • 我忽略了文件中的第一行,只是读取它并将其内容分配给我任意调用的变量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。尽管pandas将其显示为一个两列表,但结果实际上是一个整数列表,我可以使用它从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

我不太确定您希望输出是什么样子,但这至少可以为您指明正确的方向,只要您不反对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()}

相关问题 更多 >