Python 检测数据帧的所有列中的值是否为数字,并将其删除

Python 检测数据帧的所有列中的值是否为数字,并将其删除,python,pandas,Python,Pandas,我有一个这样的数据帧 col col2 0 1 1 1 B 1 2 3 D 3 4 1 4 A 2 5 2 C 6 3 2 col col2 0 1 1 1 -1 1 2 3 -1 3 4 1 4 -1 2 5 2 -1 6 3 2 我希望删除所有字符并在所有列上只保留值,如果是字符,则指定-1。像这样的

我有一个这样的数据帧

   col  col2
0   1     1
1   B     1
2   3     D
3   4     1
4   A     2
5   2     C
6   3     2
   col  col2
0    1     1
1   -1     1
2    3    -1
3    4     1
4   -1     2
5    2    -1
6    3     2
我希望删除所有字符并在所有列上只保留值,如果是字符,则指定-1。像这样的

   col  col2
0   1     1
1   B     1
2   3     D
3   4     1
4   A     2
5   2     C
6   3     2
   col  col2
0    1     1
1   -1     1
2    3    -1
3    4     1
4   -1     2
5    2    -1
6    3     2
我如何使用python做到这一点,提前谢谢你

我们可以
stack()
df,然后使用
pd.to_numeric
with
errors='concurve'
将无效的数字设置为
NaN
,然后
使用-1填充na
,然后取消堆栈(),返回原始形状,最后使用
astype(int)
如有必要,可转换为整数:

pd.to_numeric(df.stack(),errors='coerce').fillna(-1).unstack().astype(int)

IIUC

或者类似的

df.mask(df.applymap(ord)>64,-1)
Out[479]: 
  col col2
0   1    1
1  -1    1
2   3   -1
3   4    1
4  -1    2
5   2   -1
6   3    2

您可以使用
df.replace
函数替换数据帧中与
-1
字符对应的值

试试这个:

df = df.replace(r"[A-Za-z]", -1, regex=True)
print(df)
 col1 col2
0   1   1
1  -1   1
2   3  -1
3   4   1
4  -1   2
5   2  -1
6   3   2
输出:

df = df.replace(r"[A-Za-z]", -1, regex=True)
print(df)
 col1 col2
0   1   1
1  -1   1
2   3  -1
3   4   1
4  -1   2
5   2  -1
6   3   2

关于
applymap(ord)
解决方案,我不喜欢的是剩余的数字被保留为字符串。对于
fillna
/
to_numeric
解决方案,您可以在调用
fillna
中使用参数
downcast='infer'
将所有内容保持为整数:
df.apply(pd.to_numeric,errors='concure').fillna(-1,downcast='infer')