如何在这上面做一个循环

时间:2017-12-18 18:27:14

标签: python pandas loops

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

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

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

在循环之后我全都“不”

3 个答案:

答案 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。在此之后,使用fillnaNaN转换为"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'