强制熊猫将列中的 (1,2) 解释为字符串而不是范围?
Posted
技术标签:
【中文标题】强制熊猫将列中的 (1,2) 解释为字符串而不是范围?【英文标题】:Force pandas to interpret (1,2) in column as string and not as range? 【发布时间】: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
,它适用于列。
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:我无法重现 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
【讨论】:
谢谢迈克!不幸的是,您的解决方案还不完全存在。这里有一些结果 (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))
【讨论】:
以上是关于强制熊猫将列中的 (1,2) 解释为字符串而不是范围?的主要内容,如果未能解决你的问题,请参考以下文章