使用pandas dtype作为条件

4

我正在尝试从pandas数据框中的特定列中删除某些字符。由于这一切都在for循环内完成,因此我想在循环内使用if语句对所有“object” dtype列执行操作。

for col in pitchtype :
pitchtype[col] = pitchtype[col].replace(np.nan,0) 
if pitchtype[col].dtype == 'object':
    pitchtype[col] = pitchtype[col].map(lambda x: x.replace(' %',''))

是否有办法在if语句中使条件成立?

编辑:下面是我的数据框。基本上,标题中带有“%”的列在值中具有“%”符号,这些符号防止它们成为浮点数。我正在尝试删除“%”并在此后将列更改为float类型。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 264 entries, 0 to 263

数据列(共18列):

Name        264 non-null object
Team        264 non-null object
FB%         264 non-null object
FBv         264 non-null float64
SL%         264 non-null object
SLv         264 non-null float64
CT%         264 non-null object
CTv         264 non-null float64
CB%         264 non-null object
CBv         264 non-null float64
CH%         264 non-null object
CHv         264 non-null float64
SF%         264 non-null object
SFv         264 non-null float64
KN%         264 non-null object
KNv         264 non-null float64
XX%         264 non-null object
playerid    264 non-null int64

dtypes: float64(7), int64(1), object(10)
memory usage: 37.2+ KB

你能分享一下你的数据框和期望输出吗? - Mayank Porwal
已添加DF。我有IF语句,但由于其他数据类型的列被传递,它无法正确捕获或编译。我收到以下错误: AttributeError: 'int' object has no attribute 'replace' - Eric
你不需要在 object 周围加引号,否则它就不是一个 dtype,而是一个字符串,上面写着 'object' - Rocky Li
2个回答

5
我认为这可能是你要找的内容,检查每个对象以确定它们是否为字符串。
if pitchtype[col].dtype == object: # No quotes around it!
    pitchtype[col] = pitchtype[col].map(lambda x: x.replace(' %','') if type(x) == str else x)

太完美了!这个方法有效。但是,我同时使用dtype == object和if type(x) == str是否有些多余呢?我一直以为object类型就是字符串类型的一种形式。 - Eric
@Eric 如果你在加载列时使用了 memory_low=False,实际上可能会有不同的数据类型。但在这种情况下,你可以进行另一个检查:在 lambda 中加入 if "%" in x else 来确保你删除了包含 '%' 的字符串。 - Rocky Li

4
您可以使用 pd.DataFrame.select_dtypespd.Series.str.rstrip 进行操作:
for col in df.select_dtypes(['object']):
    df[col] = pd.to_numeric(df[col].str.rstrip('%'), errors='coerce')

将数据转换为float类型可以使用pd.to_numeric函数。使用参数errors='coerce'可将无法转换的值设为NaN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接