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

将函数应用于基于列的数据帧,并将其他基于索引的数据帧应用于基于列的数据帧

  •  1
  • Peterhack  · 技术社区  · 6 年前

    我想做一些手术(例如 x*apples^y )基于颜色的柱式苹果的值。相应的值位于单独的数据框中:

    import pandas as pd
    import numpy as np
    df1 = pd.DataFrame({'apples': [2, 1, 5, 6, 7], 'color': [1, 1, 1, 2, 2]})
    df2 = pd.DataFrame({'x': [100, 200], 'y': [0.5, 0.3]}).set_index(np.array([1, 2]), 'color')
    

    我正在寻找以下结果:

       apples        color
    0  100*2^0.5      1
    1  100*1^0.5      1
    2  100*5^0.5      1
    3  200*6^0.3      2
    4  200*7^0.3      2
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    使用 DataFrame.join 首先使用默认的左联接,然后使用附加的列进行操作:

    df = df1.join(df2, on='color')
    df['apples'] = df['x'] * df['apples'] ** df['y']
    print (df)
           apples  color    x    y
    0  141.421356      1  100  0.5
    1  100.000000      1  100  0.5
    2  223.606798      1  100  0.5
    3  342.353972      2  200  0.3
    4  358.557993      2  200  0.3
    

    有左联接,因此在中附加到新列 df1 应该工作:

    df = df1.join(df2, on='color')
    df1['apples'] = df['x'] * df['apples'] ** df['y']
    print (df1)
           apples  color
    0  141.421356      1
    1  100.000000      1
    2  223.606798      1
    3  342.353972      2
    4  358.557993      2
    

    另一个想法是双倍使用 map :

    df1['apples'] = df1['color'].map(df2['x']) * df1['apples'] ** df1['color'].map(df2['y'])
    print (df1)
           apples  color
    0  141.421356      1
    1  100.000000      1
    2  223.606798      1
    3  342.353972      2
    4  358.557993      2
    
        2
  •  0
  •   Vivek Kalyanarangan    6 年前

    我想你需要 pandas.merge -

    temp = df1.merge(df2, left_on='color', right_index= True, how='left')
    df1['apples'] = (temp['x']*(temp['apples'].pow(temp['y'])))
    

    产量

           apples  color
    0  141.421356      1
    1  100.000000      1
    2  223.606798      1
    3  342.353972      2
    4  358.557993      2