pandas中的列表理解

yacmzcpb  于 2023-06-04  发布在  其他
关注(0)|答案(4)|浏览(223)

我举了一个玩具的例子,但它会帮助我理解我正在尝试做的其他事情。假设我想要一个新的列在一个 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:值的长度与索引的长度不匹配
一如既往,非常感谢大家的帮助!

dddzy1tm

dddzy1tm1#

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

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

结果列表的长度将是DataFrame长度的3次幂(5x5x5 = 125)。所以才有错误。要修复,您需要以下等效内容:

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'])]
u7up0aaq

u7up0aaq2#

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

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

lf5gs5x23#

您可以使用解析列表中的np.array()函数以列表的形式获取该行的所有值。
下面的代码解决了你的问题:

df2['optimal_fruit'] = [x[0] * x[1] - x[2] for x in np.array(df2)]

它将避免在您的解析列表中键入每个列名的需要。

ogq8wdun

ogq8wdun4#

如果不想对每列重复df2:

[row[0][0]*row[0][1]-row[0][2] for row in zip(df2[['apples', 'oranges', 'bananas']].to_numpy())]

def func(row):
    print(row[0]*row[1]-row[2])

[func(*row) for row in zip(df2[['apples', 'oranges', 'bananas']].to_numpy())]

进一步阅读:

编辑:
请使用df.ilocdf.loc代替df[[...]],参见Selecting multiple columns in a Pandas dataframe

相关问题