我有一个包含每周付款值的列的数据集。我试图使用循环更改某些值,例如,如果我有一个长度为2的值,我将其转换为整数,如果长度大于2,我插入'Nope'
if len (data['V807']) == 2:
data ['V807']=int(data['V807'])
else:
data['V807']= 'Nope'
问题是,它将所有内容转换为'Nope',尽管事实上有很多长度为2的值:
在循环之后我全都“不”
答案 0 :(得分:4)
您当前的方法不起作用,因为len
中的len(data['V807'])
在整列上运行,而不仅仅是特定的单元格。执行else
位,并为每个单元分配Nope
。这是设置 -
data
V807
0 33
1 24
2 NOT EMPL->=3 MOS
3 NK-UNASCERTAIN
4 37
len(data['V807'])
5
您需要做的是,在data
中重复每一行的过程,并将值分配给相应的单元格。当然,您可以使用循环或带有apply
的循环解决方案,但使用to_numeric
的方法更快 -
data['V807'] = pd.to_numeric(data['V807'], errors='coerce').fillna('Nope')
data
V807
0 33
1 24
2 Nope
3 Nope
4 37
使用errors='coerce'
参数,不数值类型(整数或浮点数)的任何值都将转换为NaN
。在此之后,使用fillna
将NaN
转换为"Nope"
(虽然我非常怀疑你是否想要这最后一步,但这是浪费,因为它混合了浮点数和字符串)。
答案 1 :(得分:3)
我们可以使用df[~df.V807.str.isalnum()]='nope'
df
Out[95]:
V807
0 33
1 24
2 nope
3 nope
4 37
(来自coldspeed的数据: - ))
ggtags-find-definition
答案 2 :(得分:0)
通过布尔运算符使用索引可以相当轻松地完成此操作。
mask = (df['V807'].str.len() == 2)
mask2 = (df['V807'].str.len() != 2)
df[mask] = df[mask].astype(int)
df[mask2] = 'Nope'