熊猫中的列表理解

新手上路,请多包涵

我正在举一个玩具示例,但它会帮助我了解我正在尝试做的其他事情的情况。假设我想要一个数据框“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:值的长度与索引的长度不匹配

一如既往,非常感谢大家的帮助!

原文由 WhitneyChia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 441
2 个回答

本质上,您的列表理解语句是一组 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'])]

原文由 Kartik 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的新方法不起作用的原因是列表理解生成的数据比数据框中的索引数长。一个快速的解决方法是这样的:

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

原文由 jtitusj 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏