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
witherrors='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')