我在数据框中有以下列:
Column1 Column2 Column3 Column4
a 1 2 a
1 2 a c
b 3 c d
3 2 1 b
4 2 1 a
c 1 d a
这些列的类型为object
,我想将Column1
,Column2
和Column3
转换为数字类型int8
,同时保持{{1 }}作为类型对象。为此,我尝试使用Column4
(我打算在pd.to_numeric(data.Column1)
和Column2
之后使用相同的方法),但是出现以下错误:
Column3
显而易见的原因是什么。我想知道是否有什么方法可以让我摆脱这三列中由字符串形成的行,所以在那之后,我会得到:
ValueError: Unable to parse string "a" at position 0
有没有办法做到这一点?还是有另一种方式可以允许我这样做?
编辑:我已经检查了Remove non-numeric rows in one column with pandas中的问题,但这并不能解决我的问题,因为我的数据集中有多于两个的列,而我没有不想将其转换为数字。
答案 0 :(得分:2)
使用image for reference和apply
将非数字替换为缺失值,然后用to_numeric
删除NaN
的行并最后转换为integer
s:< / p>
df = df.apply(lambda x: pd.to_numeric(x, errors='coerce')).dropna().astype(int)
print (df)
Column1 Column2 Column3
3 3 2 1
4 4 2 1
详细信息:
print (df.apply(lambda x: pd.to_numeric(x,errors='coerce')))
Column1 Column2 Column3
0 NaN 1.0 2.0
1 1.0 2.0 NaN
2 NaN NaN NaN
3 3.0 2.0 1.0
4 4.0 2.0 1.0
5 NaN 1.0 NaN
编辑:
另一种解决方案是使用dropna
和DataFrame.all
检查是否不丢失值:
cols = ['Column1','Column2','Column3']
#define columns for check numeric
mask = df[cols].apply(lambda x: pd.to_numeric(x, errors='coerce')).notnull().all(axis=1)
#filtering
df = df[mask]
#converting to integers
df[cols] = df[cols].astype(int)
print (df)
Column1 Column2 Column3 Column4
3 3 2 1 b
4 4 2 1 a
print (df.dtypes)
Column1 int32
Column2 int32
Column3 int32
Column4 object
dtype: object