强制pandas将列中的(1,2)解释为字符串而不是范围?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强制pandas将列中的(1,2)解释为字符串而不是范围?相关的知识,希望对你有一定的参考价值。
我在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
'apply'的示例:
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)
Name: seats, dtype: object'
tickets['seats'][:1].values
>> '[range(1, 3)]'
如果值只是1,2
,它适用于列。
任何帮助帮助非常感谢!
答案
也许简单地迭代行的元素而不是转换为字符串然后拆分会更容易。这很简单,可以使用lambda。
tickets['seats'][:1].apply(lambda row: [int(e) for e in row])
另一答案
我无法重现range
string。但是这个函数应该适用于两种情况:
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
另一答案
感谢所有贡献者让我更接近解决方案。解决方案实际上非常简单。
挑战是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))
以上是关于强制pandas将列中的(1,2)解释为字符串而不是范围?的主要内容,如果未能解决你的问题,请参考以下文章
Python/Pandas/Datetime:将列中的整个列表转换为日期时间