我有一个带有每周工资值的列的数据集。我试图使用循环更改某些值,例如,如果我有一个长度为2的值,我将其转换为整数,如果长度大于2,我插入'Nope'
if len (data['V807']) == 2:
data ['V807']=int(data['V807'])
else:
data['V807']= 'Nope'
问题是,它将所有内容转换为'Nope',尽管有许多长度为2的值:
循环之后我全都“不”
您当前的方法不起作用,因为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
s转换为"Nope"
(虽然我非常怀疑你想要这最后一步,但这是浪费,因为它混合浮动和字符串)。
我们可以使用str.isalnum()
(数据来自coldspeed :-))
df[~df.V807.str.isalnum()]='nope'
df
Out[95]:
V807
0 33
1 24
2 nope
3 nope
4 37
您可以通过布尔运算符使用索引相当容易地完成此操作。
mask = (df['V807'].str.len() == 2)
mask2 = (df['V807'].str.len() != 2)
df[mask] = df[mask].astype(int)
df[mask2] = 'Nope'