如何只将数字保留在也有字符串的列数据框中?

时间:2018-09-05 08:45:33

标签: python string pandas dataframe

我在数据框中有以下列:

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,我想将Column1Column2Column3转换为数字类型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中的问题,但这并不能解决我的问题,因为我的数据集中有多于两个的列,而我没有不想将其转换为数字。

1 个答案:

答案 0 :(得分:2)

使用image for referenceapply将非数字替换为缺失值,然后用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

编辑:

另一种解决方案是使用dropnaDataFrame.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