为什么我的数字数据被视为对象?

时间:2017-06-13 19:32:00

标签: python pandas dataframe

当数据实际上是数字时,Pandas中的DataFrame被视为对象。我该如何解决这个问题?我假设发生了这种情况,因为我的列中的某些值不是数字 - 我试图将其转换为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转换期间,我的数据正在丢失其数据类型吗?

2 个答案:

答案 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_numericwhere一起使用。

df.D.where(df.D.str.isnumeric())

0     53
1     65
2     22
3    NaN
4     45
5     97
Name: D, dtype: object

如果您有混合类型,包括字符串和实际数字类型,则可以同时使用to_numericstr.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