Удалить строки, которые не соответствуют элементам в массиве - PullRequest
1 голос
/ 24 июня 2019

Добрый день!У меня возникли проблемы с обновлением моего CSV-файла (я использую панд).Я хочу, чтобы код удалял строку в файле csv, если элемент строки совпадает с моим определенным массивом

Например, если в моем файле csv есть следующие строки:

and 2
hi  3
or  4
is  5
hello 6

и определенный массив a задается следующим образом:

a = ['and', 'or', 'is']

d = {}

for k, v in reader.values:
    if a == k:
        break
    else:
        d[k] = int(v)

reader - это имя переменной, которую я использовал для открытия файла csv с помощью pandas

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

{'hi':3, 'hello': 6}

Как я проверял на выходе, слова, перечисленные в массиве a, все еще включены в словарь.Я надеюсь, что вы могли бы помочь мне, спасибо!

Ответы [ 2 ]

1 голос
/ 24 июня 2019

с использованием df.replace() для замены списка a на nan, а затем dropna() для получения dict():

#replace 0 with first col name
d=dict(df.replace(a,np.nan).dropna(subset=[0]).values) 

{'hi': 3, 'hello': 6}
1 голос
/ 24 июня 2019

Использование pandas isin ()

Если предположить, что ваш фрейм данных похож на приведенный ниже, который я называю df со столбцами "word" и "number".

    word    number
0   and     2
1   hi      3
2   or      4
3   is      5
4   hello   6

Я быиспользуйте функцию isin от pandas.

In [1]: a = ['and', 'or', 'is']
        df[~df['word'].isin(a)]
Out[1]: word    number
      1 hi      3
      4 hello   6

Тогда, если вам нужен словарь, вы можете просто сжать нужные вам столбцы.

In [2]: a = ['and', 'or', 'is']
        df2 = df[~df['word'].isin(a)]
        dict(zip(df2['word'], df2['number']))
Out[2]: {'hello': 6, 'hi': 3}

Используя свой оригиналcode

Если вы хотите, чтобы ваш исходный код работал, просто замените операторы if и break.

d = {}
for k, v in df.values:
    print(k)
    if k in a:
        continue
    else:
        d[k] = int(v)

Обратите внимание, что a - это список, а k - этострока.Так что a==k всегда будет иметь значение false, и вы никогда не пропустите значение.Вместо этого вам нужно проверить, есть ли k in a.Кроме того, break не совсем то, что вы хотите, так как он остановит цикл for, как только вы обнаружите значение в a.Вам нужно continue, чтобы перейти к следующему значению в вашем фрейме данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...