根据CSV文件的标签对其数据进行无序处理

2024-04-26 06:59:33 发布

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

假设我有两个CSV文件,每个文件有100行。两个CSV文件中的每一行都有相同的索引和标签,因此,这100行可以看作是对数据集。在

我的目的是根据CSV文件的不同标签,对其中一个CSV文件进行无序处理,使数据不成对。在

例如,输入:

1st CSV            2nd CSV          label
data_1             data_1'           12
data_2             data_2'           6
 ...                ...              ...

输出:

^{pr2}$

由于数据“1”和“2”具有不同的标签(分别为12和6),因此,它们被视为未配对数据。我的目的是选择具有不同标签的任意数量的数据。在

有没有什么python库或方法可以实现它?在


Tags: 文件csv数据方法目的data数量标签
2条回答

您可以使用python的随机洗牌()函数。下面是python中的示例/测试代码:

> cat ./shuffle_rows.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

data = ""
for i in range(5):
    data += "label_%d, data_%d, ...\n" % (i, i)

print("======== Input ========")
print data

import random
data = data.split("\n")
random.shuffle(data)  # shuffle modifies the sequence
data="\n".join(data)

print("======== Output ========")
print data

> ./shuffle_rows.py
======== Input ========
label_0, data_0, ...
label_1, data_1, ...
label_2, data_2, ...
label_3, data_3, ...
label_4, data_4, ...

======== Output ========
label_1, data_1, ...

label_4, data_4, ...
label_2, data_2, ...
label_3, data_3, ...
label_0, data_0, ...

没有直接的Python方法/api来完成它。据我所知,当行与行进行比较时,您希望对内容进行无序处理,以便没有匹配项(配对)。所以,你需要实现这种洗牌。因为,我花了相当长的时间在这上面,不想放弃-这是我最后一次尝试。如果需要的话,希望它能帮助你进一步修改它。在

> cat ./disjoint.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random
NUM_ITEMS = 10

data = []
for i in range(NUM_ITEMS):
    #data.append("data_%d" % (i if i%2 == 0 else i/2))  # for negative testing: create some duplicates
    data.append("data_%d" % (i))

output = list(data) # copy

def display(d, o):
    print("%3s | %8s | %8s | %6s" % ("#", "Data", "Output", "Match?"))
    len1 = len(d)
    len2 = len(o)
    lenb = max(len1, len2)
    for i in range(lenb):
        i1 = d[i] if i < len1 else "None1"
        i2 = o[i] if i < len2 else "None2"
        print("%3d | %8s | %8s | %6s" % (i, i1, str(i2), "Err" if not i2 else "Yes" if (i1 == i2) else "No"))

print("==================== Input ==================")
display(data, output)

uniq = set(data) # list without duplicates.
for i in range(NUM_ITEMS):
    d = data[i]

    tmp_uniq = set(uniq) # copy
    if d in tmp_uniq:
        tmp_uniq.remove(d) # exclude current paired item.
    if len(tmp_uniq) == 0:
        output[i] = None
        continue

    tmp_uniq = list(tmp_uniq) # shuffle works only on list
    random.shuffle(tmp_uniq) # shuffle remaining non-matching items
    a_non_matching = tmp_uniq[0]
    output[i] = a_non_matching
    uniq.remove(a_non_matching)

print("==================== Output ==================")
display(data, output)

下面是这个新测试/示例代码的输出:

^{pr2}$

相关问题 更多 >