Pandas infer_objects() 不会将字符串列转换为数字

sta*_*010 12 python pandas

我有一个数据源,其中所有值都以字符串形式给出。当我从这些数据创建 Pandas 数据框时,所有列自然都是类型object。然后我想让 Pandas自动将任何看起来像数字的列转换为数字类型(例如int64, float64)。

据推测,Pandas 提供了一个函数来执行这种自动类型推断:pandas.DataFrame.infer_objects()StackOverflow 帖子中也提到了这一点。文档说:

尝试对对象数据类型列进行软转换,使非对象列和不可转换列保持不变。推理规则与正常的 Series/DataFrame 构造期间相同。

但是,该功能对我不起作用。在下面的可重现示例中,我有两个字符串列(value1value2),它们分别明确地类似于intfloat值,但infer_objects()不会将它们从字符串转换为适当的数字类型。

import pandas as pd

# Create example dataframe.
data = [ ['Alice', '100', '1.1'], ['Bob', '200', '2.1'], ['Carl', '300', '3.1']]
df = pd.DataFrame(data, columns=['name', 'value1', 'value2'])

print(df)

#     name value1 value2
# 0  Alice    100    1.1
# 1    Bob    200    2.1
# 2   Carl    300    3.1

print(df.info())

# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype 
# ---  ------  --------------  ----- 
#  0   name    3 non-null      object
#  1   value1  3 non-null      object
#  2   value2  3 non-null      object
# dtypes: object(3)

df = df.infer_objects() # Should convert value1 and value2 columns to numerics.

print(df.info())

# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype 
# ---  ------  --------------  ----- 
#  0   name    3 non-null      object
#  1   value1  3 non-null      object
#  2   value2  3 non-null      object
# dtypes: object(3)
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

run*_*out 4

或者进一步@wwnde 相同的解决方案略有不同,

df["value1"] = pd.to_numeric(df["value1"])
df["value2"] = pd.to_numeric(df["value2"])
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个有趣的问题,我很惊讶 pandas 没有转换明显的字符串浮点数和整数,如您所示。

然而,这个小代码可以让您浏览数据框并转换您的列。

data = [["Alice", "100", "1.1"], ["Bob", "200", "2.1"], ["Carl", "300", "3.1"]]
df = pd.DataFrame(data, columns=["name", "value1", "value2"])

print(df.info(), "\n")

RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   name    3 non-null      object
 1   value1  3 non-null      object
 2   value2  3 non-null      object
dtypes: object(3)

cols = df.columns
for c in cols:
    try:
        df[c] = pd.to_numeric(df[c])
    except:
        pass

print(df.info())

RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   name    3 non-null      object 
 1   value1  3 non-null      int64  
 2   value2  3 non-null      float64
dtypes: float64(1), int64(1), object(1)
Run Code Online (Sandbox Code Playgroud)

  • 我的问题是我希望 Pandas 为我推断类型。我不知道“value1”和“value2”是数字。 (5认同)