【问题标题】:Unwrap hyphen separated numbers in a string into a range in pandas将字符串中的连字符分隔的数字解包到 pandas 的范围中
【发布时间】:2018-02-28 17:02:25
【问题描述】:

我有一个 pandas DataFrame,其邮政编码的开头按地区区分,格式如下:

region A 385
region B 656 - 659

我需要用破折号解开数据,所以它将是:

region B 656, 657, 658, 659

我的代码

postcodes.iloc[:,1] = postcodes.iloc[:,1].apply(lambda x: x.split('—'))
def unwrap_codes(row):
row = row['Postcode begins with']
if len(row) > 1:
    for x, y in row:
        while x != y:
            row.append(x=+1)
postcodes['Unwraped'] = postcodes.apply(unwrap_codes, axis=1)

返回一个 ValueError: ('太多的值需要解压 (预期 2)' 你能帮我处理这个错误吗?

【问题讨论】:

  • 缩进不正确.. 错误告诉您行中的每个条目中有两个以上的元素。
  • 在迭代列表时不应修改列表。您应该使用另一个对象,例如堆栈。当您开始迭代列表时,它可能有 2 个元素,但随着时间的推移您正在添加更多元素,这就是问题所在。可能重复stackoverflow.com/questions/6294983/…

标签: python pandas for-loop dataframe


【解决方案1】:

str.split 后跟 apply 似乎可以做到这一点:

print(df)
     region   postcode
0  region A        385
1  region B  656 - 659

df['Unwrapped'] = df.postcode.str.split('\s*-\s*')\
             .apply(lambda x: range(int(x[0]), int(x[-1]) + 1))
print(df['Unwrapped'])
0                   (385)
1    (656, 657, 658, 659)
Name: Unwrapped, dtype: object

【讨论】:

    【解决方案2】:

    @cᴏʟᴅsᴘᴇᴇᴅ 的回答很棒。我只是无聊,想写点东西。

    idx = pd.MultiIndex.from_product([df.index, [0, 1]], names=[None, 'match'])
    d = df.postcode.str.extractall('(\d+)').reindex(idx).ffill().astype(int)[0]
    
    d.unstack().add([0, 1]).apply(lambda x: list(range(*x)), 1)
    
    0                   [385]
    1    [656, 657, 658, 659]
    dtype: object
    

    【讨论】:

    • 卓越源于无聊!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多