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

时间:2020-05-09 22:27:24

标签: python pandas

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

熊猫应该提供执行此自动类型推断的功能:pandas.DataFrame.infer_objects()this StackOverflow post中也提到了它。该文档说:

尝试对对象类型化的列进行软转换,使非对象和不可转换的列保持不变。推理规则与常规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)

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

df["value1"] = pd.to_numeric(df["value1"])
df["value2"] = pd.to_numeric(df["value2"])

编辑: 这是一个有趣的问题,令我惊讶的是,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)

答案 1 :(得分:0)