【问题标题】:lambda if statement or do nothing pandaslambda if 语句或什么都不做 pandas
【发布时间】:2017-08-04 14:17:39
【问题描述】:

嘿,我浏览了一些帖子,但找不到直接答案。我正在研究具有两列 ZipCode 和 ZipCodePlusFour 的 pandas DataFrame。填充了一些 ZipCodePlusFour 单元格。所有 ZipCode 单元格都已填满。问题是邮政编码有 9 位数字。所以我试图摆脱 9 位邮政编码的最后 4 位数字并将它们放在 ZipCodePLusFour 中。

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 填充单元格,而不是留下已经在单元格中的值。

【问题讨论】:

  • else x 保持原样
  • 我认为要解决这个问题,您应该删除 else 部分?
  • 逻辑是如果字符串有6个或更多字符,将其修剪到最后4个,如果它有5个字符,则保留为5...?只是询问是否可能是一个错误的错误,因为如果规则只是应该“修剪到最多 4 个字符”,则根本不需要 if..else
  • @JackParkinson 你能在 lambda 语句中删除 else 吗?
  • 其实我不确定你能不能——我可能有点厚:/

标签: python pandas lambda


【解决方案1】:

如果您传递的值小于 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:])

【讨论】:

    【解决方案2】:

    您只想将字符串修剪到最多 5 个位置。可以df.ZipCode.str[:5]吗?

    In [78]: df
    Out[78]:
         ZipCode
    0  123456789
    1        123
    2          0
    

    对于 5 个地方的邮政编码

    In [79]: df.ZipCode.str[:5]
    Out[79]:
    0    12345
    1      123
    2        0
    Name: ZipCode, dtype: object
    

    对于邮政编码中多余的 (>5) 个字符

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

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 2014-10-08
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2015-07-18
      相关资源
      最近更新 更多