如果值不为null,Python处理特定DataDrame列的最佳方法
仅当数据帧列的特定集合不为null时,处理该集合中的值的最佳方法是什么 我的原始代码:如果值不为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
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()
的方法有很多优势吗?