【问题标题】:Splitting a string on a special character in a pandas dataframe column based on a conditional根据条件在熊猫数据框列中的特殊字符上拆分字符串
【发布时间】:2019-08-13 22:13:15
【问题描述】:

我正在尝试在我的 pandas 数据框中的地址列中建立一致性。我有一个邮政编码列,它有两种格式:1)87301 2)87301-1234。并非每一行都有连字符,所以我需要在连字符出现时对其进行拆分。

我的数据如下所示:

State  ZIP
CA     85145-7045
PA     76913   

我已经尝试了一些解决这个问题的方法。我试过了:

data['Zip_1'],data['Zip_2'] = data['Zip'].str.split('-').str

我试过了:

data['Zip'] = data['Zip'].str.split('-', n=1, expand=True)
data['Zip'] = data['Zip'][0]
data['Zip_drop'] = data['Zip'][1]

我也尝试过使用 lambda 函数。

但是它只返回空值。

对于没有连字符的邮政编码和连字符后面的数字(如果它确实包含连字符),我希望新列返回 NaN。 但是,新列只是为每个观察填充 NaN

【问题讨论】:

  • splitsville = data['Zip'][data['Zip].str.contains("-")].str.split("-")
  • ValueError: 无法使用包含 NA / NaN 值的向量进行索引。正是我正在寻找的内容,所以感谢您的尝试
  • @connerleavitt 见stackoverflow.com/questions/57316346/….str 方法作用于对象列,可以容纳任何东西,所以当它们作用于非字符串值时,它们的默认值是返回 NaN。在使用 == True.fillna(False) 对 DataFrame 进行切片时,您应该明确检查它们
  • @ALollz 很好,我在问这个问题之前已经这样做了。感谢您的验证!
  • 实际上,更好的是,您可以指定na=False 作为参数:D

标签: python pandas split


【解决方案1】:

您可以将“replace”与正则表达式结合使用。

第 1 步

example_df = pd.DataFrame({'State': ['CA', 'PA'],
                           'ZIP': ['85145-7045', '76913'] })

example_df

第 2 步

# Keep only the numbers before the hyphen (if any).
example_df = example_df.replace('\-\d*', '', regex=True)
example_df

【讨论】:

    【解决方案2】:

    获取包含连字符的所有邮政编码的数据框,并将其放入新列中

    data['Zip Hyphen'] = data['Zip'].str.find('-')
    

    然后,从 Zip 列的数据框中,删除任何包含连字符的行

     data = data.drop(data[data['Zip'].str.find('-')].index)
    

    编辑: 这段代码没有经过测试,但大致思路是有的

    【讨论】:

    • 不错的主意,虽然我想保留带有连字符的观察结果,但可以使用连字符和后面的数字
    猜你喜欢
    • 2019-02-12
    • 2015-06-25
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多