df = pd.DataFrame( data = {"CouponCode": ["1","2","3","Winter14","5"] } )
我想获取上面的数据框并得到下面的数据框。我希望 CouponCode 列中的所有数字都转换为 float 或整数,如果该值不是数字,我想将其放入新的列名 couponName 中(我将“nan”作为字符串输入,但我当然想要它们是“真正的”空值)。
df_new = pd.DataFrame(data = {"CouponCode": [1,2,3,"Winter14",5], "CouponName": ["nan", "nan", "nan", "Winter14", "nan"]} )
请您参考如下方法:
计划
- 使用
pd.to_numeric应用于'CouponCode'的每个单独元素。这很慢!我为什么要这样做?因为这是我所知道的确保int映射到int、float到float以及str到str。结果列的dtype将是object。我本可以使用errors='coerce'在整个列上执行pd.to_numeric,问题是nan会转换int到float。 - 使用
.str.is_numeric确定哪些是字符串,并将它们移植到新列。
df.loc[~df.CouponCode.astype(str).str.isnumeric(), 'CouponName'] = df.CouponCode
df.loc[:, 'CouponCode'] = df.CouponCode.apply(pd.to_numeric, errors='ignore')
df
CouponCode CouponName
0 1 NaN
1 2 NaN
2 3 NaN
3 Winter14 Winter14
4 5 NaN
df.to_dict('list')
{'CouponCode': [1, 2, 3, 'Winter14', 5],
'CouponName': [nan, nan, nan, 'Winter14', nan]}
