Pandas将混合类型转换为字符串

时间:2015-10-23 23:08:02

标签: python pandas types

给出以下数据框:

DF = pd.DataFrame({'COL1': ['A', 'B', 'C', 'D','D','D'], 
'mixed': [2016.0, 2017.0, 'sweatervest', 20, 209, 21]})
DF

    COL1    mixed
0   A       2016.0
1   B       2017.0
2   C       sweatervest
3   D       20
4   D       209 
5   D       21

我想将'mixed'转换为一个对象,使得所有数字都是整数作为字符串,所有字符串当然都是字符串。 所需的输出如下:

    COL1    mixed
0   A       2016
1   B       2017
2   C       sweatervest
3   D       20
4   D       209 
5   D       21

背景资料:

最初,'mixed'是从CSV中获取的数据框的一部分,主要由数字组成,其中包含一些字符串。当我尝试将其转换为字符串时,一些数字最后以'.0'结尾。

提前致谢...

3 个答案:

答案 0 :(得分:1)

尝试:

DF['mixed']=DF.mixed.astype(object)

这导致:

DF['mixed']

0           2016
1           2017
2    sweatervest
3             20
4            209
5             21
Name: mixed, dtype: object

答案 1 :(得分:1)

df.mixed = df.mixed.apply(lambda elt: str(int(elt)) if isinstance(elt, float) else str(elt))

这会在'mixed'列的每个元素上调用lambda elt: str(int(elt)) if isinstance(elt, float) else str(elt)函数。

注意:这假设您的所有浮点数都可以转换为整数,正如您对问题的评论所暗示的那样。

答案 2 :(得分:0)

此方法基于gbrener的答案。它遍历日期框架以查找混合的dtype列。对于每个这样的混合列,它首先用public class class1 { int size = 0; public ArrayList<Integer> foo1(){ ArrayList<Integer> result = new ArrayList<>(); for(int i = 0;i<1000;i++){ result.add(i); } // assigning size = result.size(); return result; } public int getSize() { return size; } } 替换所有nan值。然后,它将其值安全地转换为字符串。它可以作为 pd.NA 就地使用。它已在Python 3.8下使用Pandas 1进行了测试。

请注意,此答案使用assignment expressions,仅适用于Python 3.8或更高版本。但是,可以对其进行简单地修改以使其不使用。

unmix_dtypes(df)

警告:未指定显式dtype的危险之一是from typing import Union import pandas as pd def _to_str(val: Union[type(pd.NA), float, int, str]) -> Union[type(pd.NA), str]: """Return a string representation of the given integer, rounded float, or otherwise a string. `pd.NA` values are returned as is. It can be useful to call `df[col].fillna(value=pd.NA, inplace=True)` before calling this function. """ if val is pd.NA: return val if isinstance(val, float) and (val % 1 == 0.0): return str(int(val)) if isinstance(val, int): return str(val) assert isinstance(val, str) return val def unmix_dtypes(df: pd.DataFrame) -> None: """Convert mixed dtype columns in the given dataframe to strings. Ref: https://stackoverflow.com/a/61826020/ """ for col in df.columns: if not (orig_dtype := pd.api.types.infer_dtype(df[col])).startswith("mixed"): continue df[col].fillna(value=pd.NA, inplace=True) df[col] = df[col].apply(_to_str) if (new_dtype := pd.api.types.infer_dtype(df[col])).startswith("mixed"): raise TypeError(f"Unable to convert {col} to a non-mixed dtype. Its previous dtype was {orig_dtype} and new dtype is {new_dtype}.") 可以将["012", "0034", "4"]这样的列读取为整数列,从而不可挽回地丢失了前导零。更糟糕的是,如果将数据帧连接在一起,则前导零的这种丢失可能会不一致地发生,从而导致诸如[“ 012”,“ 12”,“ 34”,“ 0034”]之类的列值。