如何避免Pandas提取单行转为Series时自动转换数据类型?
如何避免Pandas提取单行转为Series时自动转换数据类型?
这个问题我之前也碰到过!Pandas的Series因为是一维同构结构,必须统一数据类型,所以当你从混合类型的DataFrame里提取一行转成Series时,它会自动把所有元素提升到能兼容所有类型的dtype(比如int和float就会统一成float),确实挺烦人的。下面给你几个可行的解决办法:
方法1:通过字典转成object dtype的Series(保留原元素类型)
原DataFrame的每一行转成字典时,会完整保留每个元素的原始类型,再用这个字典创建一个objectdtype的Series,就能完美保留各列的原始类型了:data = { "t": [1, 2, 3], "x": [1.7, 8.5, 4.3] } df = pd.DataFrame(data) # 提取第一行并保留原类型 row_as_ser = pd.Series(df.iloc[0].to_dict(), dtype='object') print(row_as_ser) # 输出: # t 1 # x 1.7 # dtype: object print(type(row_as_ser["t"])) # <class 'int'>,类型完全正确!方法2:利用原DataFrame的dtype信息批量转换
直接复用原DataFrame的列dtype配置,把提取出的Series按原类型批量转换回去,完全不用手动指定列名,适配列名多变的场景:row_ser = df.iloc[0] # 按原DataFrame的列dtype批量转换每个元素 row_ser = row_ser.astype(df.dtypes.to_dict()) print(row_ser["t"]) # 输出1,类型为int print(row_ser.dtype) # 输出object,因为元素类型不统一方法3:保留为单行DataFrame(不转成Series)
如果你能接受用单行DataFrame而非Series的话,直接用df.iloc[[0]](注意是双层方括号,返回的是DataFrame而非Series),这样所有列的dtype会和原DataFrame完全一致:row_as_df = df.iloc[[0]] print(row_as_df.dtypes) # 输出: # t int64 # x float64 # dtype: object # 访问元素时用 row_as_df["t"].iloc[0] 就能拿到int类型的值
你之前用query得到DataFrame后再取iloc[0]又转成float,就是因为这一步把DataFrame转成了Series,换成上面的方法就能完美规避类型自动转换的问题啦。
备注:内容来源于stack exchange,提问作者Damien
相关产品推荐
相关产品推荐

