Python lambda if语句或不执行任何操作

Python lambda if语句或不执行任何操作,python,pandas,lambda,Python,Pandas,Lambda,嘿,我浏览了一些帖子,但是我找不到直接的答案。我正在研究一个熊猫数据框架,它有两列ZipCode和ZipCodePlusFour。一些ZipCodePlusFour单元格已填充。所有ZipCode单元都已填充。问题是ZipCode有9位数字。所以我试着去掉9位数ZipCode的最后4位数,把它们放在ZipCodePlusfur中 df['ZipCode'] = df.ZipCode.astype(str) # just in case df['ZipCodePlusFour'] = df.Zi

嘿,我浏览了一些帖子,但是我找不到直接的答案。我正在研究一个熊猫数据框架,它有两列ZipCode和ZipCodePlusFour。一些ZipCodePlusFour单元格已填充。所有ZipCode单元都已填充。问题是ZipCode有9位数字。所以我试着去掉9位数ZipCode的最后4位数,把它们放在ZipCodePlusfur中

df['ZipCode'] = df.ZipCode.astype(str)  # just in case
df['ZipCodePlusFour'] = df.ZipCode.apply(lambda x: x[-4:] if len(x) > 5 else None)
df['ZipCode'] = df.ZipCode.apply(lambda x: x[:-4] if len(x) > 5 else 

我的问题在第二行。if语句执行它应该执行的操作,而else语句不应该执行任何操作。我尝试放置None,但它使用None填充单元格,而不是保留单元格中已有的值

如果您传递的值长度小于5位,您可以这样做:

df['ZipCode'] = df.ZipCode.apply(lambda x: x[-4:] if len(x) > 5 else x)
但您可以做得更简单,无需检查长度:

df['ZipCode'] = df.ZipCode.apply(lambda x: x[-4:])

您只需将字符串修剪到atmost 5个位置。您可以执行
df.ZipCode.str[:5]

In [78]: df
Out[78]:
     ZipCode
0  123456789
1        123
2          0
对于,5个位置的zipcodes

In [79]: df.ZipCode.str[:5]
Out[79]:
0    12345
1      123
2        0
Name: ZipCode, dtype: object
对于,zipcodes中的额外(>5)字符部分

In [80]: df.ZipCode.str[5:]
Out[80]:
0    6789
1
2
Name: ZipCode, dtype: object

else x
要保持原样,我认为要解决这个问题,您应该删除
else
部分?逻辑是,如果字符串有6个或更多字符,请将其修剪到最后4个,如果有5个字符,请保留在5…?如果这可能是一个off-by-one错误,请询问,因为如果规则只是简单地假设为“最多4个字符”,那么就根本不需要
if..else
。@JackParkinson您可以删除lambda语句中的其他内容吗?实际上我不确定您是否可以-我可能有点厚:/谢谢您,这太完美了。