NaN
。当我尝试运行to_numeric
函数时,它会以NaN的形式返回所有内容,这不是我所期待的。
想象一下,我的数据看起来像
A B C D
X Y Z 53
X Y Z 65
X Y Z 22
X Y Z 6/5/96
X Y Z 45
X Y Z 97
我正在努力让D列中的所有内容保持不变,同时将6/5/96
更改为NaN
,但我尝试的所有内容都会导致{D}列中的所有值NaN
。当我查找dtypes
时,它将列D列为对象,但它们肯定是数值。
如何在不改变实际数值的情况下修复我的DataFrame?
A B C D
X Y Z 53
X Y Z 65
X Y Z 22
X Y Z NaN
X Y Z 45
X Y Z 97
我正在使用Tabula将PDF转换为CSV。
df = pd.read_csv('TEST.csv')
df['D'] = pd.to_numeric(df['D'], errors='coerce')
您认为在Tabula PDF到CSV转换期间,我的数据正在丢失其数据类型吗?
答案 0 :(得分:3)
使用to_numeric
,但所有int
值都会投放到float
s:
df['D'] = pd.to_numeric(df['D'], errors='coerce')
但是如果是混合值 - 带字符串的数字:
df['D'] = pd.to_numeric(df['D'].astype(str), errors='coerce')
或者如果尾随空格:
df['D'] = pd.to_numeric(df['D'].astype(str).str.strip(), errors='coerce')
编辑:
df['D'] = pd.to_numeric(df['D'].str.replace(',',''), errors='coerce')
或者:
df['D'] = pd.to_numeric(df['D'].replace(',','', regex=True), errors='coerce')
答案 1 :(得分:0)
导入数据框时,列'D'
为对象,各个元素为string
。
您可以将pd.Series.str.is_numeric
与where
一起使用。
df.D.where(df.D.str.isnumeric())
0 53
1 65
2 22
3 NaN
4 45
5 97
Name: D, dtype: object
如果您有混合类型,包括字符串和实际数字类型,则可以同时使用to_numeric
和str.isnumeric
df.D.where(df.D.str.isnumeric() | pd.to_numeric(df.D, 'coerce').notnull())
0 53
1 65
2 22
3 NaN
4 45
5 97
Name: D, dtype: object
在任何一种情况下,使用assign
创建一个包含新列的副本
df.assign(
D=df.D.where(df.D.str.isnumeric() | pd.to_numeric(df.D, 'coerce').notnull())
)
A B C D
0 X Y Z 53
1 X Y Z 65
2 X Y Z 22
3 X Y Z NaN
4 X Y Z 45
5 X Y Z 97
这也应该有效:
df.assign(D=df.D.where(pd.to_numeric(df.D, 'coerce').notnull()))
A B C D
0 X Y Z 53
1 X Y Z 65
2 X Y Z 22
3 X Y Z NaN
4 X Y Z 45
5 X Y Z 97