在python中如何隐式确定数据帧列类型?(隐式转换)

在python中如何隐式确定数据帧列类型?(隐式转换),python,pandas,types,implicit-conversion,Python,Pandas,Types,Implicit Conversion,在我的环境中,出于简单性考虑,决定将所有内容作为字符串存储在hdfs中。因此,当我从这个位置将数据拉入pandas数据帧时,每个类型都是一个字符串,尽管值是int、float、bool等等 是否有一种方法可以基于值计算动态确定列属性类型?ie:看看列中的每个值都是“x”类型,然后按此类型转换 编辑: 由于我的python版本(我想),我无法使用下面的解决方案。所以我决定自己尝试一个骇人的解决方案。这可能并不完美,而且我还没有确定日期。由于这两件事,我不打算将其作为解决方案发布,但这可能是其他需要

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

是否有一种方法可以基于值计算动态确定列属性类型?ie:看看列中的每个值都是“x”类型,然后按此类型转换

编辑:

由于我的python版本(我想),我无法使用下面的解决方案。所以我决定自己尝试一个骇人的解决方案。这可能并不完美,而且我还没有确定日期。由于这两件事,我不打算将其作为解决方案发布,但这可能是其他需要它的人的起点:

#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函数实现隐式转换

输入数据

df=pd.DataFrame(np.array([['1','0.3','True']),
['2','5.2','False']]),
列=['int'、'float'、'bool'])
铸造功能

def cast_df(df):
对于df.columns中的列:
如果df[column].dtype!=np.object:
打破
column\u types=df[column].apply(lambda x:type(ast.literal\u eval(x)))
如果len(column_types.unique())==1:
打印(f“列{Column}被强制转换为{Column_types[0]}”)
df[column]=df[column].astype(列类型[0])
返回df
cast_df(df)的输出。数据类型

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
列int被强制转换为
列浮动被浇铸为
列布尔被铸造为
int64
浮动浮动64
布尔布尔布尔
数据类型:对象

由于某些原因,这在我的python内核3.5、pyspark 2.4中不起作用。我至少一直收到一个错误。你收到了什么错误消息?