我有一个数据源,其中所有值都以字符串形式给出。当我根据这些数据创建Pandas数据框时,所有列自然都是object
类型。然后,我想让熊猫自动 将任何看起来像数字的列转换为数字类型(例如int64
,float64
)。
熊猫应该提供执行此自动类型推断的功能:pandas.DataFrame.infer_objects()
。 this StackOverflow post中也提到了它。该文档说:
尝试对对象类型化的列进行软转换,使非对象和不可转换的列保持不变。推理规则与常规Series / DataFrame构造过程中的规则相同。
但是,该功能不适用于我。在下面的可重现示例中,我有两个字符串列(value1
和value2
),它们分别看起来像int
和float
的值,但是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)
任何帮助将不胜感激。
答案 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)
df_new = df.convert_dtypes()可能会有所帮助。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html