如何更改 .csv 文件的所有样本中的特定元素?

Posted

技术标签:

【中文标题】如何更改 .csv 文件的所有样本中的特定元素?【英文标题】:How can I change specific elements in all samples of a .csv file? 【发布时间】:2017-10-24 19:27:12 【问题描述】:

作为输入,我有一个 .csv 文件,例如:

user, withdraw, date
50D8BF0DA22D6C914777D8F59DAAB4D8, -125, 01-02-2015
674BCF0CD236621E5680073334A73C32, -5, 01-02-2015
E17E1691D35FB2FB675E3B787B8BEDF1, -845, 01-02-2015
50D8BF0DA22D6C914777D8F59DAAB4D8, -250, 01-02-2015
674BCF0CD236621E5680073334A73C32, -98, 01-02-2015
50D8BF0DA22D6C914777D8F59DAAB4D8, -17, 01-02-2015

我想识别所有类似的“哈希”代码,并将它们更改为标签,例如“user1”、“user2”、“user3”……等等。

我一直在尝试使用 pandas 来做到这一点,但没有成功。知道我能做什么吗?

【问题讨论】:

我不相信你可以更新。相反,阅读、修改和替换。 ://docs.python.org/3/library/csv.html 和 https://***.com/questions/16020858/inline-csv-file-editing-with-python 感谢@DavyM 的支持,我不知道为什么人们投了反对票。无论如何,回答您的问题,我想更改 .csv,或生成一个新的。 说真的,知道为什么人们讨厌我的帖子吗? =/。我真的很想知道我做错了什么。另外,我应该删除它吗? 【参考方案1】:

首先将 CSV 读入 Pandas DF:

df = pd.read_csv('/path/to/file.csv', skipinitialspace=True)

产量:

In [84]: df
Out[84]:
                               user  withdraw        date
0  50D8BF0DA22D6C914777D8F59DAAB4D8      -125  01-02-2015
1  674BCF0CD236621E5680073334A73C32        -5  01-02-2015
2  E17E1691D35FB2FB675E3B787B8BEDF1      -845  01-02-2015
3  50D8BF0DA22D6C914777D8F59DAAB4D8      -250  01-02-2015
4  674BCF0CD236621E5680073334A73C32       -98  01-02-2015
5  50D8BF0DA22D6C914777D8F59DAAB4D8       -17  01-02-2015

现在我们可以分解user 列:

In [85]: df['user'] = 'user' + pd.Series((pd.factorize(df.user)[0]+1).astype(str))

In [86]: df
Out[86]:
    user  withdraw        date
0  user1      -125  01-02-2015
1  user2        -5  01-02-2015
2  user3      -845  01-02-2015
3  user1      -250  01-02-2015
4  user2       -98  01-02-2015
5  user1       -17  01-02-2015

并将 DF 写回 csv:

df.to_csv('/path/to/file_new.csv', index=False)

【讨论】:

非常感谢!!效果很好。 @RogerAlmeidaLeite,很高兴我能帮上忙 :)【参考方案2】:

你需要先建立一个用户字典,如下:

import csv

hashes = 
user_number = 1
entries = []

with open('input.csv', 'rb') as f_input:
    csv_input = csv.reader(f_input, skipinitialspace=True)
    header = next(csv_input)

    for row in csv_input:
        user = row[0]

        if user not in hashes:
            hashes[user] = "user".format(user_number)
            user_number += 1

        row[0] = hashes[user]
        entries.append(row)

with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(header)
    csv_output.writerows(entries)

给你一个output.csv 包含:

user,withdraw,date
user1,-125,01-02-2015
user2,-5,01-02-2015
user3,-845,01-02-2015
user1,-250,01-02-2015
user2,-98,01-02-2015
user1,-17,01-02-2015

【讨论】:

以上是关于如何更改 .csv 文件的所有样本中的特定元素?的主要内容,如果未能解决你的问题,请参考以下文章

从特定行读取 csv

如何在 CSV 文件的一行中写入任意数量的列表元素?

如何删除充满 csv 文件的文件夹中没有特定标题的所有列?

将大 csv 文件中的小随机样本加载到 R 数据框中

如何更改特定类名的所有类名元素

如何在 Prometheus 查询中设置返回样本频率?