2024-05-23 14:39:15 发布
网友
我有一个数据集,其中有一列显示每周工资值。我试着用一个循环来改变一些值,例如,如果我有一个长度为2的值,我把它转换成整数,如果长度超过2,我就插入'Nope'
if len (data['V807']) == 2: data ['V807']=int(data['V807']) else: data['V807']= 'Nope'
问题是,它将所有内容都转换为“Nope”,尽管存在许多长度为2的值:
循环之后我都说“不”
通过布尔运算符使用索引可以很容易地做到这一点。你知道吗
mask = (df['V807'].str.len() == 2) mask2 = (df['V807'].str.len() != 2) df[mask] = df[mask].astype(int) df[mask2] = 'Nope'
我们可以使用str.isalnum()(来自coldspeed的数据:-))
str.isalnum()
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分配给每个单元。这是设置-
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
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"(尽管我非常怀疑您是否需要这最后一步,但这是一种浪费,因为它混合了浮点和字符串)。你知道吗
errors='coerce'
NaN
fillna
"Nope"
通过布尔运算符使用索引可以很容易地做到这一点。你知道吗
我们可以使用
str.isalnum()
(来自coldspeed的数据:-))您当前的方法不起作用,因为
len(data['V807'])
中的len
操作整个列,而不仅仅是一个特定的单元格。执行else
位,并将Nope
分配给每个单元。这是设置-您需要做的是,对
data
中的每一行重复这个过程,并为相应的单元格赋值。当然,你可以用循环,或者用apply
的循环解决方案,但是用to_numeric
有一种更快的方法-使用
errors='coerce'
参数,任何不是数值类型(整数或浮点)的值都将转换为NaN
。在这之后,使用fillna
将NaN
转换为"Nope"
(尽管我非常怀疑您是否需要这最后一步,但这是一种浪费,因为它混合了浮点和字符串)。你知道吗相关问题 更多 >
编程相关推荐