Pandas的convert_dtypes无法处理标记为对象的数字

zc0qhyus  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一个panda Dataframe ,其中列的Dtype为object。这些列的值显然是数字。但是,convert_dtypes无法识别数字类型,并对所有列再次返回object。下面是一些输出,可以说明问题:

my_df.convert_dtypes().info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 6 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   A             3 non-null      object
 1   B             3 non-null      object
 2   C             3 non-null      object
 3   D             3 non-null      object
 4   E             3 non-null      object
 5   F             3 non-null      object
dtypes: object(6)
memory usage: 168.0+ bytes

这些是 Dataframe 的单元格:

my_df
    A   B   C   D   E   F
0   0   1   3   0   1   1
1   0   2   2   2   0   1
2   0   1   0   2   0   1

虽然我可以使用其他方法(例如to_numeric)转换列,但我希望能够有一种通用的方法来完成此操作,因为传入的数据并不总是数字,在这种情况下string会做得很好。
Dataframe 来自另一个服务,所以如果你需要更多的信息请告诉我。这就是to_numeric不能工作的原因。基本上,我需要尽可能地将类型转换为数字,否则转换为字符串。
Python版本是3.8.5,Pandas版本是1.1.2

bvn4nwqk

bvn4nwqk1#

如果可能,将逻辑转换为数值,则在对话失败时使用to_numeric中的errors='ignore'参数返回列的原始值(这意味着列中至少有一个非数值):

print (df)
   A  B  C  D  E  F
0  0  1  3  0  1  a
1  0  2  d  s  0  s
2  0  1  0  s  0  d

df = df.apply(pd.to_numeric, errors='ignore')

print (df.dtypes)
A     int64
B     int64
C    object
D    object
E     int64
F    object
dtype: object
yks3o0rb

yks3o0rb2#

下面两行代码将执行您直觉上期望convert_dtypes执行的操作:

from io import StringIO
df = pd.read_csv(StringIO(df.to_csv(index=False)))

但是请注意,该操作会重置索引,因此如果要保留索引,可能需要稍微修改该表达式。

相关问题