Измените определенные значения в Pandas DataFrame (где есть смешанные типы) - PullRequest
0 голосов
/ 28 мая 2018

У меня есть фрейм данных pandas, и я хотел бы увеличить любое значение больше нуля с некоторым приращением (скажем, .001), но только в подмножестве столбцов.

df=pd.DataFrame({'a': ['abc', 'abc', 'abc', 'abc'], 'b': [2,np.nan, 0, 6], 'c': [1, 0, 2, 0]})

     a    b  c
0  abc  2.0  1
1  abc  NaN  0
2  abc  0.0  2
3  abc  6.0  0

Итак, я попробовал это:

df[df.loc[:,['b', 'c']]>0]+=1

TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value

Однако, поскольку первый столбец имеет объект типа d, я не могу сделать это, как вы можете видеть по ошибке.Желаемый результат будет:

     a    b      c
0  abc  2.001  1.001
1  abc  NaN    0
2  abc  0.0    2.001
3  abc  6.001  0

Есть ли какой-нибудь способ сделать это без явного зацикливания каждого столбца в отдельности?

Мне кажется, я просто упускаю простой подход, но, похоже, не могу найти пример.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вы можете использовать add с select_dtypes

df.add((df.select_dtypes(exclude=object)>0).astype(int)*0.0001).combine_first(df)
Out[18]: 
     a       b       c
0  abc  2.0001  1.0001
1  abc     NaN  0.0000
2  abc  0.0000  2.0001
3  abc  6.0001  0.0000
0 голосов
/ 28 мая 2018

Вы также можете добавить только столбцы b и c.

df[["b", "c"]] += np.where(df[["b", "c"]] > 0, 0.01, 0)

Мы используем np.where, чтобы заполнить 0, чтобы обойти np.nan в данных.

Anton vBR предлагает элегантный способ выбора нужных столбцов.

0 голосов
/ 28 мая 2018

Вы можете попробовать это:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': ['abc', 'abc', 'abc', 'abc'], 
                   'b': [2,np.nan, 0, 6], 
                   'c': [1, 0, 2, 0]})

inc = 0.01
df.loc[:, df.dtypes.ne('object')] += inc
df.replace({inc:0}, inplace=True)        

print(df)

Или как предложено Тай с np.where (это должно быть быстрее):

cols = df.columns[df.dtypes.ne('object')]
df[cols] += np.where(df[cols] >0, 0.01, 0)

Возвращает:

     a     b     c
0  abc  2.01  1.01
1  abc   NaN  0.00
2  abc  0.00  2.01
3  abc  6.01  0.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...