如何使用python获取csv文件中第一列仅出现一次的值

2024-07-01 07:00:32 发布

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

我是python新手,所以我尝试读取包含700行的csv,其中包含一个标题,并获得一个包含第一个csv列的唯一值的列表。你知道吗

示例CSV:

SKU;PRICE;SUPPLIER
X100;100;ABC
X100;120;ADD
X101;110;ABV
X102;100;ABC
X102;105;ABV
X100;119;ABG

我用了这个例子

How to create a list in Python with the unique values of a CSV file?

所以我做了以下工作:

import csv
mainlist=[]
with open('final_csv.csv', 'r', encoding='utf-8') as csvf:
    rows = csv.reader(csvf, delimiter=";")
    for row in rows:
        if row[0] not in rows:
            mainlist.append(row[0])
print(mainlist)

我注意到在调试中,行是1行而不是700行,我只得到

['SKU']字段我做错了什么?你知道吗

谢谢


Tags: csvin标题withrowsrowabc新手
3条回答

如果需要第一列的唯一值,可以修改代码以使用set而不是list。可能是这样的:

import collections
import csv
filename = 'final_csv.csv'

sku_list = []
with open(filename, 'r', encoding='utf-8') as f:
    csv_reader = csv.reader(f, delimiter=";")

    for i, row in enumerate(csv_reader):
        if i == 0:
            # skip the header
            continue

        try:
            sku = row[0]
            sku_list.append(sku)
        except IndexError:
            pass

print('All SKUs:')
print(sku_list)

sku_set = set(sku_list)
print('SKUs after removing duplicates:')
print(sku_set)

c = collections.Counter(sku_list)
sku_list_2 = [k for k, v in c.items() if v == 1]
print('SKUs that appear only once:')
print(sku_list_2)

with open('output.csv', 'w') as f:
    for sku in sorted(sku_set):
        f.write('{}\n'.format(sku))

既不使用pandas也不使用csv的解决方案:

lines = open('file.csv', 'r').read().splitlines()[1:]

col0 = [v.split(';')[0] for v in lines]

uniques = filter(lambda x: col0.count(x) == 1, col0)

或者,使用map(但可读性较差):

col0 = list(map(lambda line: line.split(';')[0], open('file.csv', 'r').read().splitlines()[1:]))

uniques = filter(lambda x: col0.count(x) == 1, col0)

使用熊猫的解决方案。您需要对正确的列调用unique方法,这将返回该列中具有唯一值的pandas系列,然后使用tolist方法将其转换为列表。你知道吗

下面SKU列的示例。你知道吗

import pandas as pd 

df = pd.read_csv('final_csv.csv', sep=";")
sku_unique = df['SKU'].unique().tolist()

如果您不知道/不关心列名,可以在正确的列数上使用iloc。请注意,计数索引从0开始:

df.iloc[:,0].unique().tolist()

如果问题的目的是只获取出现一次的值,那么可以使用value_counts方法。这将创建一个系列,索引为SKU的值,计数为值,然后必须以类似的方式将系列的索引转换为列表。使用第一个示例:

import pandas as pd 

df = pd.read_csv('final_csv.csv', sep=";")
sku_counts = df['SKU'].value_counts()
sku_single_counts = sku_counts[sku_counts == 1].index.tolist()

相关问题 更多 >

    热门问题