首先是不可能的回报
NaN
s与
integers
因为
楠
s是
float
按设计。
如果您的解决方案有效
mixed
类型-带数字的
string
s:
df = pd.DataFrame({
'Regular Price': ['a',1,2.3,'a',7],
'B': list(range(5))
})
print (df)
B Regular Price
0 0 a
1 1 1
2 2 2.3
3 3 a
4 4 7
df['Regular Price'] = df['Regular Price'].apply(
lambda x: int(round(x)) if isinstance(
x, (int, float)) else None
)
print (df)
B Regular Price
0 0 NaN
1 1 1.0
2 2 2.0
3 3 NaN
4 4 7.0
但如果所有数据都是字符串
to_numeric
具有
errors='coerce'
用于将非数字转换为
楠
s:
df = pd.DataFrame({
'Regular Price': ['a','1','2.3','a','7'],
'B': list(range(5))
})
print (df)
B Regular Price
0 0 a
1 1 1
2 2 2.3
3 3 a
4 4 7
df['Regular Price'] = pd.to_numeric(df['Regular Price'], errors='coerce').round()
print (df)
B Regular Price
0 0 NaN
1 1 1.0
2 2 2.0
3 3 NaN
4 4 7.0
编辑:
我还需要删除浮点并使用
int
只有
可以通过转换为
None
对于
楠
s并转换为
整数
:
df['Regular Price'] = pd.to_numeric(df['Regular Price'],
errors='coerce').round()
df['Regular Price'] = np.where(df['Regular Price'].isnull(),
None,
df['Regular Price'].fillna(0).astype(int))
print (df)
B Regular Price
0 0 None
1 1 1
2 2 2
3 3 None
4 4 7
print (df['Regular Price'].apply(type))
0 <class 'NoneType'>
1 <class 'int'>
2 <class 'int'>
3 <class 'NoneType'>
4 <class 'int'>
Name: Regular Price, dtype: object
但它的性能很慢,所以最好
不要使用它
. 还应该存在另一个问题-soe函数失败,所以最好是
浮动
s如果使用
楠
s:
测试一些函数,如
diff
在里面
50k rows DataFrame
:
df = pd.DataFrame({
'Regular Price': ['a','1','2.3','a','7'],
'B': list(range(5))
})
df = pd.concat([df]*10000).reset_index(drop=True)
print (df)
df['Regular Price'] = pd.to_numeric(df['Regular Price'], errors='coerce').round()
df['Regular Price1'] = np.where(df['Regular Price'].isnull(),
None,
df['Regular Price'].fillna(0).astype(int))
In [252]: %timeit df['Regular Price2'] = df['Regular Price1'].diff()
类型错误:不支持的操作数类型-:“int”和“NoneType”
In [274]: %timeit df['Regular Price3'] = df['Regular Price'].diff()
1000 loops, best of 3: 301 µs per loop
In [272]: %timeit df['Regular Price2'] = df['Regular Price1'] * 1000
100 loops, best of 3: 4.48 ms per loop
In [273]: %timeit df['Regular Price3'] = df['Regular Price'] * 1000
1000 loops, best of 3: 469 µs per loop
编辑:
df=pd。数据帧({
“正常价格”:[a'、'1'、'2.3'、'a'、'7'],
“B”:列表(范围(5))
})
打印(df)
B正常价格
1 1 1
2 2 2.3
3.3安
4 4 7
df[“正常价格”]=pd。to_numeric(df['Regular Price',errors='concure')。圆形()
打印(df)
B正常价格
0 0 NaN
1 1 1.0
2 2 2.0
4 4 7.0
第一个是可能的删除
楠
按列排序
Regular Price
然后转换为
整数
.
df1 = df.dropna(subset=['Regular Price']).copy()
df1['Regular Price'] = df1['Regular Price'].astype(int)
print (df1)
B Regular Price
1 1 1
2 2 2
4 4 7
处理你需要的,但不要改变索引。
#e.g. some process
df1['Regular Price'] = df1['Regular Price'] * 100
最后的
combine_first
-it添加
楠
到
正常价格
柱
df2 = df1.combine_first(df)
print (df2)
B Regular Price
0 0.0 NaN
1 1.0 100.0
2 2.0 200.0
3 3.0 NaN
4 4.0 700.0