如何在熊猫中将 if/else 转换为 np.where

Posted

技术标签:

【中文标题】如何在熊猫中将 if/else 转换为 np.where【英文标题】:How to convert if/else to np.where in pandas 【发布时间】:2020-10-06 10:13:40 【问题描述】:

我的代码在下面

将 pd.to_numeric 应用于应该为 int 或 float 但作为对象出现的列。我们可以像应用 np.where 那样将更多转换成 pandas 的方式

if df.dtypes.all() == 'object':
    df=df.apply(pd.to_numeric,errors='coerce').fillna(df)
else:
    df = df

【问题讨论】:

【参考方案1】:

一个简单的单行是assignselest_dtypes,它将重新分配现有的列

df.assign(**df.select_dtypes('O').apply(pd.to_numeric,errors='coerce').fillna(df))

np.where:

df[:] = (np.where(df.dtypes=='object',
          df.apply(pd.to_numeric,errors='coerce').fillna(df),df)

示例(检查Price 列):

d = 'CusID': 0: 1, 1: 2, 2: 3,
     'Name': 0: 'Paul', 1: 'Mark', 2: 'Bill',
     'Shop': 0: 'Pascal', 1: 'Casio', 2: 'Nike',
     'Price': 0: '24000', 1: 'a', 2: '900'
df = pd.DataFrame(d)

print(df)
   CusID  Name    Shop  Price
0      1  Paul  Pascal  24000
1      2  Mark   Casio      a
2      3  Bill    Nike    900

df.to_dict()
'CusID': 0: 1, 1: 2, 2: 3,
 'Name': 0: 'Paul', 1: 'Mark', 2: 'Bill',
 'Shop': 0: 'Pascal', 1: 'Casio', 2: 'Nike',
 'Price': 0: '24000', 1: 'a', 2: '900'

(df.assign(**df.select_dtypes('O').apply(pd.to_numeric,errors='coerce')
   .fillna(df)).to_dict())

'CusID': 0: 1, 1: 2, 2: 3,
 'Name': 0: 'Paul', 1: 'Mark', 2: 'Bill',
 'Shop': 0: 'Pascal', 1: 'Casio', 2: 'Nike',
 'Price': 0: 24000.0, 1: 'a', 2: 900.0

【讨论】:

【参考方案2】:

你的 if/else 等价于 df.mask

df_out = df.mask(df.dtypes =='O', df.apply(pd.to_numeric, errors='coerce')
                                    .fillna(df))

【讨论】:

以上是关于如何在熊猫中将 if/else 转换为 np.where的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中将索引转换为日期时间?

如何在熊猫中将列转换为一个日期时间列?

如何在熊猫中将日历年转换为水年

如何在熊猫中将月度数据转换为季度

如何在熊猫中将字符串日期转换为数字[重复]

如何在多级列(熊猫)中将一级索引转换为新级别