【问题标题】:Force pandas to interpret (1,2) in column as string and not as range?强制熊猫将列中的 (1,2) 解释为字符串而不是范围?
【发布时间】:2018-06-09 16:58:41
【问题描述】:

我在熊猫数据框中有这种奇怪的行为。我在具有以下示例内容的列上使用 .apply(single_seats_comma):(1,2)。但是,它似乎将其返​​回为range(1,3),而不是字符串(1,2)。其他行也有超过 2 个条目,例如 (30,31,32)。我有一个在, 上拆分的函数,并将括号中的每个值转换为一个新行,但是使用(x,x) 它会中断。

def single_seats_comma(row):
    strlist = str(row).split(',')
    strlist = filter(None, strlist) 
    intlist = []
    for el in strlist:
        intlist.append(int(el))
    return intlist

“申请”示例:

tickets['seats'][:1].apply(single_seats_comma)

def的错误输出为

ValueError: invalid literal for int() with base 10: 'range(1'

试图找到解决方案,我发现了这个:

str(tickets['seats'][:1])
>>'0    (1, 2)\nName: seats, dtype: object'

tickets['seats'][:1].values
>> '[range(1, 3)]'

如果值只是1,2,它适用于列。

非常感谢任何帮助!

【问题讨论】:

    标签: python string pandas range apply


    【解决方案1】:

    我无法重现 rangestring。 但是这个函数应该适用于这两种情况:

    def single_seats_comma(row):
        if type(row) is tuple:
            return list(row)
        elif type(row) is range:
            res = [row.start]
            end = row.stop - 1
            if end - row.start > 1:
                res.append(end)
        return res
    

    例子:

    >>> tickets = pd.DataFrame({'seats': [(100, 1022), range(3, 4), range(2, 10)]})
    >>> tickets['seats'].apply(single_seats_comma)
    0    [100, 1022]
    1            [3]
    2         [2, 9]
    Name: seats, dtype: object
    

    【讨论】:

    • 谢谢迈克!不幸的是,您的解决方案还不完全存在。这里有一些结果 (1, 2)>> [1, 3] // (30, 31) >> [30, 32] // (44)>>[44, 45]。有没有办法让熊猫避免将 () 解释为范围?
    • 修改了我的解决方案。
    • def single_seats_comma(row): result = [] if type(row) is tuple: return list(row) elif type(row) is range: res = [row.start] end = row.如果 end - row.start > 1 则停止:result = list(range(res[0], end)) else: result = res 返回结果
    • 嗨,迈克,最后需要稍作修改。像 (17, 18, 19, 20) 这样的特殊情况显示为 [17, 20],但正确的应该是 [17, 18, 19, 20]。看看我上面的评论,哪个有效。再次感谢。
    【解决方案2】:

    也许简单地迭代行的元素而不是转换为字符串然后拆分会更容易。这很简单,可以使用 lambda。

    tickets['seats'][:1].apply(lambda row: [int(e) for e in row])
    

    【讨论】:

      【解决方案3】:

      感谢所有贡献者让我更接近解决方案。解决方案其实很简单。

      挑战在于 pandas 将 (1,2) 解释为范围而不是字符串 但是,目标是创建所有值的列表,最初是通过在 ',' 上拆分字符串。不需要!

      list(range(1,2)) 已经完成了这项工作。这是示例和解决方案:

      list(range(11, 17))
      >> [11, 12, 13, 14, 15, 16]
      
      tickets['seats'][0]
      >> range(1, 3)
      
      list(alltickets['seats'][0])
      >> [1, 2]
      

      所以解决方案:

      def single_seats_comma(row):
          strlist = list(row)
          return strlist
      
      tickets['seats'].apply(single_seats_comma)
      

      tickets['seats'].apply(lambda row: list(row))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 2021-01-01
        • 2019-09-27
        • 2019-04-16
        • 2013-07-25
        • 2023-02-24
        相关资源
        最近更新 更多