如果值不为null,Python处理特定DataDrame列的最佳方法

如果值不为null,Python处理特定DataDrame列的最佳方法,python,pandas,dataframe,null,nan,Python,Pandas,Dataframe,Null,Nan,仅当数据帧列的特定集合不为null时,处理该集合中的值的最佳方法是什么 我的原始代码: 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

仅当数据帧列的特定集合不为null时,处理该集合中的值的最佳方法是什么

我的原始代码:

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
函数,但根据:。似乎
.apply()
更适合更新数据框中的每一列

然后我遇到了这样一个问题:并设法提出了一个可行的解决方案:

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

我花了很长时间才弄明白这一点,而且看起来不太优雅,所以我想知道是否有更好/更具Python风格的方法来做到这一点?

IIUC,试试
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

IIUC,尝试
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
配合使用

配合使用


谢谢,看起来很有希望。但是,我如何将其仅应用于特定的列,而不是像上面的
columns\u-to\u过程中的示例那样应用于整个数据帧呢?@RoryLM我编辑了答案。让我知道它是否有效:)为快速响应干杯。现在可以工作了,我做了一些小改动(参见编辑)。你知道
.where()
是否比我最初使用
.loc()
的方法有很多优势吗?谢谢,看起来很有希望。但是,我如何将其仅应用于特定的列,而不是像上面的
columns\u-to\u过程中的示例那样应用于整个数据帧呢?@RoryLM我编辑了答案。让我知道它是否有效:)为快速响应干杯。现在可以工作了,我做了一些小改动(参见编辑)。你知道
.where()
是否比我最初使用
.loc()
的方法有很多优势吗?