python - 如何在python中隐式确定数据框列类型?(隐式转换)
问题描述
在我的环境中,出于简单起见,决定将所有内容作为字符串存储在 hdfs 中。因此,当我从这个位置将数据拉入 pandas 数据帧时,每种类型都是一个字符串,尽管值是整数、浮点数、布尔值等......
有没有办法根据值评估动态确定列属性类型?即:看看列中的每个值都是'x'类型,然后这样转换?
编辑:
由于我的 python 版本(我认为),我无法获得以下解决方案。所以我决定自己尝试一个hacky解决方案。这可能并不完美,我还没有确定日期。由于这两件事,我不会将其作为解决方案发布,但也许这可以成为其他需要它的人的起点:
#get dtypes when we can - Doesn't do dates.
for i in df:
try:
df[i] = df[i].astype(int)
print(i, 'is an int')
except:
[]
try:
if '.' in str(df[i]):
df[i] = df[i].astype(float)
print(i, 'is a float')
except:
[]
try:
if df[i].replace('False', '').unique()=='True' or df[i].replace('False', '').unique() == 'TRUE':
df[i] = df[i].replace('False', '').astype(bool).astype(int)
print(i, 'is bool')
except:
print(i, 'is an object')
本质上,我只是试图在错误发生时强制转换并捕获错误。我确信这可能是一个非常糟糕的方法来解决这个问题。
解决方案
我不知道有任何 pandas 内置功能可以做到这一点,但您可以使用 python ast.literal_eval函数实现隐式转换。
输入数据
df = pd.DataFrame(np.array([['1', '0.3', 'True'],
['2', '5.2', 'False']]),
columns=['int', 'float', 'bool'])
铸造功能
def cast_df(df):
for column in df.columns:
if df[column].dtype != np.object:
break
column_types = df[column].apply(lambda x: type(ast.literal_eval(x)))
if len(column_types.unique()) == 1:
print(f"Column {column} is casted to {column_types[0]}")
df[column] = df[column].astype(column_types[0])
return df
输出cast_df(df).dtypes
:
Column int is casted to <class 'int'>
Column float is casted to <class 'float'>
Column bool is casted to <class 'bool'>
int int64
float float64
bool bool
dtype: object
推荐阅读
- wordpress - 使用 Apache 对不在 URI 白名单中的每个请求使用 HTTP 404 响应
- linux - Yocto 为静态库构建失败并出现错误“未找到匹配”
- c# - 如何在没有模型绑定的视图中动态添加元素?
- css - 为什么设置了css max-width,但div仍然展开?
- ruby-on-rails - 排除使用friendly_id?
- sql - 查询以查找具有多个按属性分组的值的最大值
- python - 如何在 Pygame 中创建边框,使我的角色不会走过图像?
- django - 缺少 1 个必需的位置参数:“pk”
- javascript - JavaScript:对对象的迭代(无法返回答案)
- java - 运行可执行的 .jar 文件并在 Windows 登录之前确认运行以隐藏对 Windows 桌面的访问