如何在这[闭合]上做一个循环

问题描述 投票:-1回答:3

我有一个带有每周工资值的列的数据集。我试图使用循环更改某些值,例如,如果我有一个长度为2的值,我将其转换为整数,如果长度大于2,我插入'Nope'

if len (data['V807']) == 2:
  data ['V807']=int(data['V807'])
else:
  data['V807']= 'Nope' 

问题是,它将所有内容转换为'Nope',尽管有许多长度为2的值:The actual dataset

循环之后我全都“不”

python pandas loops
3个回答
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。在此之后,使用fillnaNaNs转换为"Nope"(虽然我非常怀疑你想要这最后一步,但这是浪费,因为它混合浮动和字符串)。


3
投票

我们可以使用str.isalnum()(数据来自coldspeed :-))

df[~df.V807.str.isalnum()]='nope'
df
Out[95]: 
   V807
0    33
1    24
2  nope
3  nope
4    37

0
投票

您可以通过布尔运算符使用索引相当容易地完成此操作。

mask = (df['V807'].str.len() == 2)
mask2 = (df['V807'].str.len() != 2) 

df[mask] = df[mask].astype(int)
df[mask2] = 'Nope'
© www.soinside.com 2019 - 2024. All rights reserved.