我举了一个玩具的例子,但它会帮助我理解我正在尝试做的其他事情。假设我想要一个新的列在一个 Dataframe 'optimal_fruit'中,它是apples * 橙子- bananas。
我可以做这样的事情来得到它。
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:值的长度与索引的长度不匹配
一如既往,非常感谢大家的帮助!
4条答案
按热度按时间dddzy1tm1#
从本质上讲,列表解析语句是一组3个嵌套循环。在代码中:
结果列表的长度将是DataFrame长度的3次幂(5x5x5 = 125)。所以才有错误。要修复,您需要以下等效内容:
在列表理解方面:
u7up0aaq2#
你的新方法不起作用的原因是因为列表解析产生的数据比你的数据框中的索引数要长。一个快速的解决方法是这样的:
lf5gs5x23#
您可以使用解析列表中的
np.array()
函数以列表的形式获取该行的所有值。下面的代码解决了你的问题:
它将避免在您的解析列表中键入每个列名的需要。
ogq8wdun4#
如果不想对每列重复df2:
或
进一步阅读:
编辑:
请使用
df.iloc
和df.loc
代替df[[...]]
,参见Selecting multiple columns in a Pandas dataframe