2016-11-17 160 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'])]