强制pandas将列中的(1,2)解释为字符串而不是范围?

时间:2017-12-29 08:03:25

标签: python string pandas range apply

我在pandas Dataframe中有这种奇怪的行为。我在具有以下示例内容的列上使用.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,则它适用于列。

非常感谢任何帮助帮助!

3 个答案:

答案 0 :(得分:2)

我无法重现range字符串。 但是这个功能应该适用于两种情况:

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)

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

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

答案 2 :(得分:0)

感谢所有贡献者让我更接近解决方案。解决方案实际上非常简单。

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

list(范围(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))