2016-11-17 169 views
2

我给出了一个玩具的例子,但它会帮助我了解我正在尝试做的其他事情。比方说,我想要一个数据框'optimal_fruit'中的新列是苹果*橙 - 香蕉。大熊猫列表理解

我可以做这样的事情来得到它。

df2['optimal_fruit'] = df2['apples'] * df2['oranges'] - df2['bananas'] 


apples oranges bananas optimal_fruit 
1  6  11  -5 
2  7  12  2 
3  8  13  11 
4  9  14  22 
5  10  15  35 

如果我尝试做这样的事情会发生什么?我怎么能在列表理解中做到这一点?

df2['optimal_fruit'] = [x * y - z for x in df2['apples'] for y in df2['oranges'] for z in df2['bananas']] 

我得到的错误:

ValueError异常:值的长度不符合指标

的长度和往常一样,感谢大家这么多的帮助!

回答

5

本质上,您的列表理解语句是一组3个嵌套循环。在代码中:

l = [] 
for x in df2['apples']: 
    for y in df2['oranges']: 
     for z in df2['bananas']: 
      l.extend([x * y - z]) 

结果列表的长度将是DataFrame长度的3倍。因此错误。要解决,就需要相当于:

for x, y, z in zip(df2['apples'], df2['oranges'], df2['bananas']): 
    l.extend([x * y - z]) 

在列表理解的术语:

[x * y - z for x, y, z in zip(df2['apples'], df2['oranges'], df2['bananas'])] 
2

你的新方法不工作的原因是因为列表理解产生的数据比你的数据框中索引的数量要长。对此的快速解决方案如下所示:

[x * y - z for x,y,z in zip(df2['apples'], df2['oranges'], df2['bananas'])]