Панды: замена «-» при использовании в качестве нуля, но не при использовании в качестве отрицательного - PullRequest
0 голосов
/ 01 октября 2018

Я читаю CSV-файл в pandas dataframe.

df= pd.read_csv("table.csv", encoding = 'ISO-8859-1')

У меня есть столбец с именем 'value', который содержит '-', когда значение равно nil.Моя цель состоит в том, чтобы отфильтровать все строки, в которых значение в этом столбце равно nil.

Однако знак также содержится, когда значение является отрицательным.

Когда я пытаюсь:

    df['value'] = df['value'].str.replace(',', '')
    df['value'] = df['value'].str.replace('-', '0')
    df['value'] = df['value'].astype(str).astype(float)
    df= df[df['value'] !=0]

Все отрицательные числа становятся положительными, когда я убираю отрицательный знак.

Однако, если я не преобразовываю '-' в '0', я получаю ошибку:

ValueError: could not convert string to float: '-'

Спасибо за любую помощь.

Ответы [ 5 ]

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

Поскольку вы используете панд, вы можете привести строки в числа, и нули, обозначенные через '-', будут принудительно введены в NaN, а '-4' станет целым числом -4.

test = pd.DataFrame([['-', '-2', '-', '0'],
                   ['3', '4', '-', '-1'],
                   ['-', '-', '-', '5'],
                   ['-', '-3', '-', '4']],
                   columns=list('ABCD'))

test.apply(pd.to_numeric, args=('coerce',))

Вы должны вернуться:

     A    B   C  D
0  NaN -2.0 NaN  0
1  3.0  4.0 NaN -1
2  NaN  NaN NaN  5
3  NaN -3.0 NaN  4
0 голосов
/ 01 октября 2018

Если вы пытаетесь отфильтровать строки со значением 'nil', если я правильно понимаю, вы можете сэкономить несколько шагов:

input df:

   Row Value
0    1     -
1    2    -8
2    3     4
3    4     8
4    5     -
5    6   -17
6    7    12
7    8     0

Это все вашиконтрольные примеры.Шаг фильтрации - 1 строка:

df.loc[df['Value'] != '-']

вывод:

   Row Value
1    2    -8
2    3     4
3    4     8
5    6   -17
6    7    12
7    8     0

Как вы можете видеть, он избавился от обоих случаев, когда значение было равно "-", но сохранило отрицательные числа, который спасает вас от любого типа конверсий, которые вы делаете заранее ... df.loc фильтрует по строке для столбца «Значение».

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

Как указал @Allolz, чтобы избавиться от разделителя , тысяч, используйте аргумент thousands в pd.read_csv():

df= pd.read_csv("table.csv", thousands=',', encoding = 'ISO-8859-1')

Если я правильно понимаю, проще всегоДля этого нужно использовать pd.to_numeric, который может преобразовать все нечисловые числа в NaN, который затем можно заменить на 0:

df['value'] = pd.to_numeric(df.value,errors='coerce').fillna(0)

Пример:

df = pd.DataFrame({'value':['-','-0.5','0.5','-']})
>>> df
  value
0     -
1  -0.5
2   0.5
3     -

df['value'] = pd.to_numeric(df.value,errors='coerce').fillna(0)
>>> df
   value
0    0.0
1   -0.5
2    0.5
3    0.0

Но есливы могли бы также использовать replace вместо str.replace, чтобы заменить полные строки вместо подстрок:

df['value'] = df['value'].replace('-',0).astype(float)

Пример:

>>> df
  value
0     -
1  -0.5
2   0.5
3     -

df['value'] = df['value'].replace('-',0).astype(float)
>>> df
   value
0    0.0
1   -0.5
2    0.5
3    0.0
0 голосов
/ 01 октября 2018

Вы можете использовать заявку.Попробуйте:

def replace_val(val):
    if val == '-':
        return 0
    return val

df['value'] = df['value'].apply(replace_val)
0 голосов
/ 01 октября 2018

try

 nil_mask = df['value'] == '-'
 df['value'][nil_mask] = 0

это установлено только в ноль случаев, когда все значение равно '-', это будет работать?

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