【问题标题】:choose values from dataframe columns depending on a column holding column names根据包含列名的列从数据框列中选择值
【发布时间】:2021-10-03 05:57:54
【问题描述】:

例如,如果我有以下数据框

df = pd.DataFrame({'a':[0,1,2], 'b':[3,4,5], 'c':['a','a','b']})

我想制作一个结果列,以便输出为

df1 = pd.DataFrame({'a':[0,1,2], 'b':[3,4,5], 'c':['a','a','b'], 'res':[0, 1, 5]})

如果列“c”包含值“a”等,则“res”列值取自列“a”。 实际上我有很多列,所以我想避免硬编码 pd.where(df.c=='a', ...) 是否有一些惯用的方法来完成任务?

【问题讨论】:

    标签: python pandas dataframe select


    【解决方案1】:

    方案一:使用apply

    ​​>

    每行使用pandas.DataFrame.apply获取索引并获取对应的值

    df['res'] = df.apply(lambda s: s[s['c']], axis=1)
    

    输出:

       a  b  c  res
    0  0  3  a    0
    1  1  4  a    1
    2  2  5  b    5
    

    方案二:直接切片

    通过直接切片底层 numpy 数组,这是一种更快的替代方法:

    # first map the columns to their position (a->0, b->1…)
    cols = {k:v for v,k in enumerate(df.columns)}
    # slice the elements
    df['res'] = df.values[df.index, df['c'].map(cols)]
    

    解决方案 3

    最后,用locnumpy.diag 来获得对角线的有趣替代方案(警告:这是非常低效的内存):

    import numpy as np
    df['res'] = np.diag(df.loc[df.index, df['c']])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多