代码之家  ›  专栏  ›  技术社区  ›  max

使用多个熊猫列应用函数?[复制品]

  •  0
  • max  · 技术社区  · 6 年前

    我需要在pandas数据框中创建一个依赖于同一行中其他项的列。例如,这是我的数据帧。

    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
    

    我需要第三列,如果行中有'a'和2,则为1,否则为0。所以会是[ 0,0,0,1,0,0,0]

    我怎么用熊猫 apply map 这样做?遍历行是我的第一个想法,但这似乎是一种笨拙的方法。

    2 回复  |  直到 6 年前
        1
  •  2
  •   pault    6 年前

    你可以使用 apply 具有 axis=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
    

    但是 应用 是缓慢的,如果可能的话应该避免。在这种情况下,对布尔逻辑操作进行矢量化会更好。

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

    这与使用 应用 上面。

        2
  •  1
  •   MisterMonk    6 年前

    您可以尝试使用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)