我有一个Pandas系列(可能是一个列表,这不是很重要)的列表包含(简化,但也可以是字母)正数和负数, 比如
0 [12,-13,0,6]
1 [2,-3,8,233]
2 [0,6,8,3]
对于其中的每一个,我想在三列数据框中填充一行,其中包含所有正值的列表,所有负值的列表以及某个间隔中包含的所有值的列表。如:
[[12,6],[-13],[0,6]]
[[2,8,233],[-3],[2,8]]
[[6,8,3],[],[6,8,3]]
我首先想到的是使用列表推导来生成列表的三元组列表,这些列表将使用pd.DataFrame转换为正确的形式。 这是因为我不想在列表列表上循环3次以便每次使用新的选择启发式时都会应用,感觉缓慢而无聊。
但问题是我实际上无法很好地生成三元组列表[[positive],[negative],[interval]]。 我使用的语法如
[[[positivelist.extend(number)],[negativelist], [intervalist.extend(number)]]\
用于listoflists中listofnumbers的listofnumbers,用于listofnumbers中的数字\
if number> 0 else [positivelist],[negativelist.extend(number)],[intervalist.extend(number)]]
但是说实话,这是不可读的,无论如何它没有做我想做的事,因为延长产量没有。
那么我怎么能不循环三次(我可以在列表列表中有数百万个元素,在子列表中,我可能想要对这些数字应用更复杂的公式,这是第一种方法) ?
我考虑过使用函数式编程,map / lambda;但它是unpythonic。问题是:python中的内容可能有助于做到这一点吗?
我的猜测是:
newlistoflist=[]
for list in lists:
positive=[]
negative=[]
interval=[]
for element in list:
positive.extend(element) if element>0
negative.extend(element) if element<0
interval.extend(element) if n<element<m
triad=[positive, negative,interval]
newlistoflist.append(triad)
你觉得怎么样?
答案 0 :(得分:1)
你可以这样做:
import numpy
l = [[12,-13,0,6], [2,-3,8,233], [0,6,8,3]]
l = numpy.array([x for e in l for x in e])
positive = l[l>0]
negative = l[l<0]
n,m = 1,5
interval = l[((l>n) & (l<m))]
print positive, negative, interval
输出:[ 12 6 2 8 233 6 8 3] [-13 -3] [2 3]
修改:三合一版本:
import numpy
l = numpy.array([[12,-13,0,6], [2,-3,8,233], [0,6,8,3]])
n,m = 1,5
triad = numpy.array([[e[e>0], e[e<0], e[((e>n) & (e<m))]] for e in l])
print triad
输出:
[[array([12, 6]) array([-13]) array([], dtype=int64)]
[array([ 2, 8, 233]) array([-3]) array([2])]
[array([6, 8, 3]) array([], dtype=int64) array([3])]]