当前位置: 首页 > 知识库问答 >
问题:

使用多个Pandas列应用函数?[重复]

严令秋
2023-03-14

我需要在我的熊猫数据框中制作一个列,它依赖于同一行中的其他项目。例如,这是我的数据框。

    df = pd.DataFrame(
        [['a',],['a',1],['a',1],['a',2],['b',2],['b',2],['c',3]],
        columns=['letter','number']
    )
   letters  numbers
 0    a     1
 1    a     1
 2    a     1
 3    a     2
 4    b     2
 5    b     2
 6    c     3

I need a third column, that is 1 if 'a' and 2 are present in the row, and 0 otherwise. So it would be [`0,0,0,1,0,0,0]`

How can I use Pandas `apply` or `map` to do this? Iterating over the rows is my first thought, but this seems like a clumsy way of doing it.

共有2个答案

施兴言
2023-03-14

您可以尝试使用pd.Series.where()/np.where()。如果您只对布尔值的int表示感兴趣,可以选择其他解决方案。如果希望If/else值有更多的自由度,可以使用np.where()

import pandas as pd
import numpy as np

# create example
values = ['a', 'b', 'c']
df = pd.DataFrame()
df['letter'] = np.random.choice(values, size=10)
df['number'] = np.random.randint(1,3, size=10)

# condition
df['result'] = np.where((df['letter'] == 'a') & (df['number'] == 2), 1, 0)
柯子琪
2023-03-14

您可以使用应用轴=1。假设您想调用新列c

df['c'] = df.apply(
    lambda row: (row['letter'] == 'a') and (row['number'] == 2),
    axis=1
).astype(int)

print(df)
#  letter  number  c
#0      a     NaN  0
#1      a     1.0  0
#2      a     1.0  0
#3      a     2.0  1
#4      b     2.0  0
#5      b     2.0  0
#6      c     3.0  0

但是apply很慢,如果可能的话应该避免。在这种情况下,最好使用向量化的布尔逻辑运算。

df['c'] = ((df['letter'] == "a") & (df['number'] == 2)).astype(int)

这与上面使用apply的结果相同。

 类似资料:
  • 我试图将数据框的多行合并成一行,不同值的列合并成一个列表。有多个列具有不同的值。 在一个列表中只需设置一列('b'),效果很好,但我不知道如何对多个列进行设置。 数据帧: 首选数据帧后期操作: 有没有一个简单的方法可以做到这一点?

  • 如何在熊猫身上做到这一点: 更新2:这个问题是在V0.11.0左右提出的。因此,许多问题和答案都不太相关。

  • 文档显示了如何使用以输出列名为键的dict一次对groupby对象应用多个函数: 但是,这只对Series groupby对象有效。并且当类似地将dict传递给groupby数据帧时,它希望键是将应用该函数的列名。 我想做的是对几个列应用多个函数(但某些列将被多次操作)。此外,一些函数将依赖于groupby对象中的其他列(如sumif函数)。我当前的解决方案是逐列执行,并执行与上面的代码类似的操作

  • 问题内容: 我有一个带有timeindex和3列的数据帧,其中包含3D矢量的坐标: 我想对也返回向量的每一行应用转换 但是如果我这样做: 我最后得到了一个以元组为元素的熊猫系列。这是因为apply将在不解压的情况下获取myfunc的结果。如何更改myfunc,以便获得具有3列的新df? 编辑: 以下所有解决方案均有效。Series解决方案确实允许使用列名,而List解决方案的执行速度似乎更快。 问

  • 我想通过对两个现有列应用函数,在数据框中创建一个新列。根据这个答案,当我只需要一列作为参数时,我就能够创建一个新列: 但是,当函数需要多个参数时,我不知道如何执行相同的操作。例如,如何通过将列a和列B传递给下面的函数来创建新列?