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
放在元素不能被解释为数字的地方。我对这是否合适有不同的看法。