如何在这上面做一个循环

2024-05-23 14:39:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,其中有一列显示每周工资值。我试着用一个循环来改变一些值,例如,如果我有一个长度为2的值,我把它转换成整数,如果长度超过2,我就插入'Nope'

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

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

循环之后我都说“不”


Tags: 数据内容datalenif整数elseint
3条回答

通过布尔运算符使用索引可以很容易地做到这一点。你知道吗

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

df[mask] = df[mask].astype(int)
df[mask2] = 'Nope'

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

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

您当前的方法不起作用,因为len(data['V807'])中的len操作整个列,而不仅仅是一个特定的单元格。执行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。在这之后,使用fillnaNaN转换为"Nope"(尽管我非常怀疑您是否需要这最后一步,但这是一种浪费,因为它混合了浮点和字符串)。你知道吗

相关问题 更多 >