Конвертировать DataFrame с «N / As», чтобы вычислить процентное изменение - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь преобразовать следующий DataFrame (содержит несколько 'N / As') в плавающее значение, чтобы я мог выполнить операцию процентного изменения:

d = pd.DataFrame({"A":['N/A','$10.00', '$5.00'], 
           "B":['N/A', '$10.00', '-$5.00']})

В конечном счете, я бы хотел, чтобы результат был:

(ОБНОВЛЕНИЕ: я не хочу удалять исходные значения N / A. Я хотел бы сохранить их там как заполнители.)

enter image description here

Поскольку нет никаких флагов для работы с отрицательными числами, я не могу использовать:

pct_change(-1)

Итак, мне нужно использовать:

d['A'].diff(-1)/d['A'].shift(-1).abs()

Но я получаю ошибку:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Для первого шага я пытаюсь преобразовать данные из объекта / строки в плавающее, но вывод неожиданный (для меня). Я получаю плавающие «NaNs» вместо действительного числа.

>d['A_float'] = pd.to_numeric(d['A'], errors='coerce')
>d
        A         B  A_float
0     N/A       N/A      NaN
1  $10.00  -$100.00      NaN
2   $5.00    -$5.00      NaN
>d.dtypes
A           object
B           object
A_float    float64
dtype: object

В качестве простого теста я попытался вычесть '1' из значения, но все равно получил число с плавающей точкой 'NaN'.

>d['A_float_minus1_test'] = pd.to_numeric(d['A'], errors='coerce')-1
>d
        A         B  A_float  A_float_minus1_test
0     N/A       N/A      NaN                  NaN
1  $10.00  -$100.00      NaN                  NaN
2   $5.00    -$5.00      NaN                  NaN

>d.dtypes
A                       object
B                       object
A_float                float64
A_float_minus1_test    float64
dtype: object

Есть ли простой способ получить следующий результат? Я думаю о том, чтобы индивидуально изменить каждый столбец DataFrame на float, а затем выполнить операцию. Должен быть более простой способ.

Желаемый вывод:

(ОБНОВЛЕНИЕ: я не хочу удалять исходные значения N / A. Я хотел бы сохранить их там как заполнители.)

enter image description here

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 января 2019
import pandas as pd 

d = pd.DataFrame({"A":['N/A','$10.00', '$5.00'], 
           "B":['N/A', '$10.00', '-$5.00']})

# Covert to number, remove '$', assign to new columns
d[['dA','dB']] = d[['A','B']].apply(lambda s: s.str.replace('$','')).apply(pd.to_numeric, errors='coerce')

# Perform calculations across desired column
d[['dA','dB']] = d[['dA','dB']].diff(-1)/d[['dA','dB']].shift(-1).abs()

print(d)
        A        B   dA   dB
0     N/A      N/A  NaN  NaN
1  $10.00   $10.00  1.0  3.0
2   $5.00   -$5.00  NaN  NaN
0 голосов
/ 14 января 2019

Чтобы преобразовать ваши столбцы из строки в число с плавающей точкой, вы можете использовать apply, например:

d['A_float'] = d['A'].apply(lambda x: float(x.split('$')[1]) if x != '' else 0.0)

x.split('$')[1] используется для удаления символа $ (и, возможно, минус ранее).

Тогда я не уверен в том, что вы пытаетесь сделать, но если вы пытаетесь вычислить процентное значение A от B, вы можете использовать np.vectorize следующим образом:

d['Percent'] = np.vectorize(percent)(d['A'],d['B'])
def percent(p1, p2):
     return (100 * p2) / p1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...