我有一个数据源,其中所有值都以字符串形式给出。当我从这些数据创建 Pandas 数据框时,所有列自然都是类型object。然后我想让 Pandas自动将任何看起来像数字的列转换为数字类型(例如int64, float64)。
据推测,Pandas 提供了一个函数来执行这种自动类型推断:pandas.DataFrame.infer_objects()。StackOverflow 帖子中也提到了这一点。文档说:
尝试对对象数据类型列进行软转换,使非对象列和不可转换列保持不变。推理规则与正常的 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)
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
或者进一步@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)
| 归档时间: |
|
| 查看次数: |
5983 次 |
| 最近记录: |