给出以下数据框:
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'结尾。
提前致谢...
答案 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”]之类的列值。