这是示例代码:
import pandas as pd
data = {
'Id': ['id1', 'id2', 'id3', 'id4'],
'col1': [41, 41, 41, 41],
'col2': [6, 6, 6, 6]
}
df = pd.DataFrame(data)
df.iloc[:,1:] = df.iloc[:,1:].astype(float)
df.iloc[:,1:] = df.iloc[:,1:].div(150)
这会产生错误:
Name: col1, dtype: float64' has dtype incompatible with int64, please explicitly cast to a compatible dtype first.
df.iloc[:,1:] = df.iloc[:,1:].astype(float)
但是有效的是:
for col in df.columns[1:]:
df[col] = df[col].astype(float).div(150)
这是解决这个问题的唯一方法吗?看起来效率很低。
问题是由于在索引分配中使用了切片
:
。
df[col]
将使用新的 dtype 创建一个新系列,但 df.loc[:]
(或 df.iloc[:, 1:]
)只会更改值 ,同时保留原始 dtypes。这就是您的错误的原因(float64' 的 dtype 与 int64 不兼容),因为您不应该在整数列中分配浮点数。
用途:
cols = df.columns[1:]
df[cols] = df[cols].astype(float).div(150)
请注意,如果您在其之前强制使用 dtypes,那么您的方法将会起作用:
df = df.astype({'col1': float, 'col2': float})
df.iloc[:,1:] = df.iloc[:,1:].astype(float)
df.iloc[:,1:] = df.iloc[:,1:].div(150)
输出:
Id col1 col2
0 id1 0.001822 0.000267
1 id2 0.001822 0.000267
2 id3 0.001822 0.000267
3 id4 0.001822 0.000267