我有带有浮动街道编号的DF,有时是“ NaN”或“ x-y”(例如:30-32),但经常是x.y(例如:32.0而不是30) 我需要将其更改为int(当然,如果课程号中没有“-”)。 我已经尝试过
chunk.loc["-" not in chunk["Street Number"] & chunk["Street Number"].notna(), 'Street Number'] = chunk["Street Number"].astype(int)
我知道在我的“ =”符号后出现问题。请问如何有条件地用自己的值更新数据框值? 我也尝试过
chunk[["Street Number"]].astype(int)
没有错误
DF的样本:
0 | NaN
1 | 1.0
2 | 6.0
3 | 170.0
4 | 61.0
5 | 51-52
我尝试强制使用dtype“街道编号”:np.uint16,但出现ValueError:Integer列在第12列中具有NA值
答案 0 :(得分:1)
使用更改后的Cedric H. solution,但输出中是混合的字符串,整数,浮点数(NaN
):
def convert_street_number_values(x):
try:
x = float(x)
if x.is_integer():
return int(x)
else:
return x
except Exception:
return x
chunk = pd.DataFrame({'Street Number':[np.nan, '1.0', '6.0', '170.0', '61.0', '51-52']})
chunk['Street Number'] = chunk['Street Number'].apply(convert_street_number_values)
print (chunk)
Street Number
0 NaN
1 1
2 6
3 170
4 61
5 51-52
编辑:
问题是,如果有多个不同的组-熊猫会将列转换为整数,但是如果至少有一个NaN
的值,它将转换回floats
。
适用于所有数据的解决方案正在转换为strings
:
def convert_street_number_values(x):
try:
x = float(x)
if x.is_integer():
return str(int(x))
else:
return str(x)
except Exception:
return str(x)
因为可以使用Nullable Integer Data Type转换为缺少值的整数:
chunk['Street Number'] = chunk['Street Number'].astype('Int64')
,但如果至少为字符串值,则失败。
因此,如果将所有非数字都转换为NaN
,则可以正常工作:
chunk['Street Number'] = pd.to_numeric(chunk['Street Number'], errors='coerce').astype('Int64')
答案 1 :(得分:0)
我会做这样的事情:
def convert_street_number_values(v):
# Add more complex 'rules' as you need
try:
return int(v)
except Exception:
return v
df['Steet Number'].apply(convert_street_number_values)