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

Python 为什么我的数字数据被视为对象?,python,pandas,dataframe,Python,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。当我查找dty

当数据实际上是数字时,数据框将被视为对象。如何解决此问题?我假设发生这种情况是因为我的列中的某些值不是数字-我正在尝试将其转换为
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列作为对象列出,但它们肯定是数值

在不改变实际数值的情况下,如何将数据帧修复为这样

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

我正在使用tabla将PDF转换为CSV

df = pd.read_csv('TEST.csv')
df['D'] = pd.to_numeric(df['D'], errors='coerce')
您是否认为在表格PDF到CSV转换期间,我的数据正在丢失其数据类型

使用,但所有
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')
编辑:

或:

使用,但所有
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')
编辑:

或:


导入数据帧时,列
'D'
是对象,单个元素是
字符串

您可以将
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

导入数据帧时,列
'D'
是对象,单个元素是
字符串

您可以将
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


你需要发布你的代码。我真的没什么可发布的。我将添加我正在使用的内容。我不知道那是什么样子的
csv
,这就是重点。还包括
csv
的前几行,以及在该部分csv上运行代码后的结果。谢谢大家!我真的很感激。你需要发布你的代码。我真的没有什么可以发布的。我将添加我正在使用的内容。我不知道那是什么样子的
csv
,这就是重点。还包括
csv
的前几行,以及在该部分csv上运行代码后的结果。谢谢大家!我真的很感激。当我这样做的时候,D列中的每个数值也变成了NaN。这就是问题所在。这仍然会导致所有NaN值。。。编辑:刚刚编辑了问题hmmm,什么是打印(df['D'].apply(type))?
Name:D,Length:200,dtype:object
很清楚,它是作为对象而不是数值来读取的,但我不知道为什么。我想知道当我将数据从PDF转换为CSV时是否会发生这种情况。需要将
替换为空字符串-检查编辑后的答案。当我这样做时,D列中的每个数值也变为NaN。这就是问题所在。这仍然会导致所有NaN值。。。编辑:刚刚编辑了问题hmmm,什么是打印(df['D'].apply(type))?
Name:D,Length:200,dtype:object
很清楚,它是作为对象而不是数值来读取的,但我不知道为什么。我想知道当我将数据从PDF转换为CSV时是否会发生这种情况。需要将
替换为空字符串-检查编辑的答案。我将如何实现这一点?
TypeError:assign()接受1个位置参数,但给出了2个
@mischell woops。。。已修复。我想您可以指出,它确实不是推荐的解决方案-
int
s和
float
s:(@jezrael注意到我根本没有修改列,只是将
np.NaN
放在元素不能被解释为数字的地方。我对这是否合适有不同的看法。我将如何实现它?
TypeError:assign()采用1个位置参数,但给出了2个
@Mitchell woops…已修复。我认为您可以指出这确实不是推荐的解决方案-
int
s与
float
s:(@jezrael注意到我根本没有修改这个列,只是把
np.NaN
放在元素不能被解释为数字的地方。我对这是否合适有不同的看法。