Python лучший способ обработать указанный c Pandas столбец DataDrame, если значение не равно NULL - PullRequest
1 голос
/ 09 января 2020

Каков наилучший способ обработки значений в заданном c наборе столбцов Dataframe, только если он не равен нулю?

мой исходный код:

for i in columns_to_process:
    df[i] = df[i].astype(str) + '!'

#columns_to_process is a list of selected df column name strings

Я понял, что это будет превратить пустые значения в nan!, но я просто хочу оставить их пустыми.

Я рассмотрел использование функций .apply() и lambda, но, по-видимому, это плохая практика при работе с отдельными столбцами, согласно : Pandas: Как я могу использовать функцию apply () для одного столбца? . Похоже, что .apply() больше подходит для обновления каждого столбца в фрейме данных.

Затем я наткнулся на это: заменил ненулевые значения в столбце на 1 и мне удалось сделать это рабочее решение:

for i in columns_to_process:
    df.loc[df[i].notnull(), i] = df.loc[df[i].notnull(), i].astype(str) + '!'

Мне потребовалось много времени, чтобы понять это, и я не выгляжу очень элегантно, поэтому мне интересно, есть ли лучший / более питонский c способ сделать это?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

IIU C, попробуйте pandas.DataFrame.where:

# Sample df
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
                            'two'],
                   'bar': ['A', 'B', np.nan, 'A', 'B', 'C'],
                   'baz': [1, 2, np.nan, 4, 5, 6],
                   'zoo': ['x', 'y', 'z', 'q', 'w', 't']})

columns_to_process = ['bar', 'baz']
df[columns_to_process] = df[columns_to_process].where(df[columns_to_process].isna(), lambda x: x.astype(str)+'!')
df

Выход:

   bar    baz  foo zoo
0  A!!  1.0!!  one   x
1  B!!  2.0!!  one   y
2  NaN    NaN  one   z
3  A!!  4.0!!  two   q
4  B!!  5.0!!  two   w
5  C!!  6.0!!  two   t
1 голос
/ 09 января 2020

Использование DataFrame.where с DataFrame.add

df.astype(str).add('!').where(df.notnull())
#to fill NaN with the previous null values
#df.astype(str).add('!').where(df.notnull(),df) 
...