Проверка на наличие дублирующихся значений в столбце - PullRequest
0 голосов
/ 29 октября 2018

У меня есть текстовый файл, который выглядит так:

Input
3 A 4 4.2
4 B 5 3.2
5 C 4 4.0
5 D 4 8.0
........

Единственные интересующие столбцы - это 0,1 и 3. Мой скрипт ниже делает следующее: если значение в столбце 1 соответствует определенной букве, столбец 3 умножается на константу. Теперь я хочу пройти через столбец 0 и, если есть повторяющиеся целые числа, добавить значения в столбце 3 вместе (т. Е. В столбце 0 есть две цифры 5, поэтому я бы добавил 1,2 и 2,4 (значения после умножения на константу, 4,0 x 0,3). = 1.2)).

Output
3 A 4 3.4
4 B 5 3.2
5 C 4 3.6 (the entries in column 1 and 2 don't really matter after addition)
........

Я думаю, это было бы легко в пандах, но я написал в некоторых словарях, что усложняет процесс:

import numpy as np

ring_dict = dict()
answer = []
ring = open('data.txt', "r")

for line in ring:
     f2 = line.split(" ")
     key2 = int(f2[0])
     value2 = float(f2[3])
     name = f2[1]
     ring_dict[key2] = [name, value2]
         if name == 'A':
             answer = value2 * 0.81
         elif name == 'B':
             answer = value2 * 1
         else:
             answer = value2 * 0.3

Я не уверен, как действовать здесь. Я не могу перебрать key2 (т. Е. Для x в key2), чтобы найти повторы, поэтому я не уверен, как проверить наличие дубликатов. Аналогично, если я превращу key2 в массив, словарь не будет работать.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Я все еще не уверен на 100%, что вы хотите (особенно с колонками 1 и 2), но, как вы упомянули, с pandas проблема становится немного более тривиальной:

import pandas as pd

# read the csv into a pd.DataFrame
df = pd.read_csv('data.txt', sep=' ', header=None)

# Multiply the column[3] by the given constant (default to 0.3 if not 'A' or 'B')
df[3] = df.apply(lambda x: round(x[3] * {'A': 0.81, 'B': 1}.get(x[1], 0.3),1), axis=1)

# Group the DataFrame by column[0] and return a new DataFrame with the sum; drop column[2].
df = df.groupby(0).agg(['sum']).drop(columns=2).reset_index(col_level=0)

# Drop the multi-index returned by the agg() method
df.columns = newdf.columns.droplevel(1)

#    0   1    3
# 0  3   A  3.4
# 1  4   B  3.2
# 2  5  CD  3.6

Это дает вам больше свободы для манипулирования данными. Но если вам все еще нужен такой формат dict, как у вас, вы можете сделать это:

my_dict = {v[0]: [v[1],v[2]] for v in newdf.to_dict('list').values()}

# {3: [4, 5], 'A': ['B', 'CD'], 3.4: [3.2, 3.5999999999999996]}

# Note: rounding issue on the last part, but that's easier to smooth out.

Я обновлю этот ответ вариантом dict, если это все еще необходимо.

0 голосов
/ 29 октября 2018

Вы можете проверить, существует ли ring_dict[key2[i]] и инициализировать или увеличить его, используя следующую команду

for i in range(len(f2)):
    if(not ring_dict[key2[i]]):
        ring_dict[key2[i]]=[name[i],value2[i]]
    else:
        ring_dict[key2[i]][1]+=value2[i]
...