python - 如何隐式确定 python 中的数据框列类型? (隐式转换)

标签 python pandas types implicit-conversion

在我的环境中,出于简单性考虑,决定将所有内容作为字符串存储在 hdfs 中。因此,当我从这个位置将数据拉入 pandas 数据帧时,每种类型都是一个字符串,尽管值是 ints、floats、bool 等......

有没有一种方法可以根据值评估动态确定列属性类型?即:看看列中的每个值都是“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

关于python - 如何隐式确定 python 中的数据框列类型? (隐式转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66270034/

相关文章:

python - 使用 Numpy 数组在数据帧中进行矢量化查找

java - Eclipse AST Java 模型 : Where in ICompilationUnit stored whether it is class, 接口(interface)或枚举?

python - 用对自身的引用替换类中的方法

python - 如何在python中的pandas.DataFrame中找出全部用零填充的行或列并将其删除?

python - 如何在图片文件名和循环中使用变量来使用 pygame 打开多张图片而不会使代码困惑

python - 时间序列数据的 Django 数据库结构?

parsing - 具有存在量化的解析器的类型签名

python - 在 Python 中指定二进制值的开始和结束

python - 如何在 Python 中绘制置信区间?

python - SQLAlchemy Postgres 查询是 JSON 中存在的键