【问题标题】:Populate df column on median of a subset from another df在另一个 df 的子集的中位数上填充 df 列
【发布时间】:2021-03-25 15:54:00
【问题描述】:

我有两个数据框:一个代表样本块 (df1),另一个代表时间序列中多个样本的性能值 (df2)。我想通过使用字典切片 df2 并计算中位数来填充 df1。虽然我可以通过 for 循环强制它,但我想学习更合适的方法。我觉得 df.apply() 应该可以做到,但是我遇到了“'Series'对象是可变的,因此它们不能被散列”错误。

df1=pd.DataFrame(columns=['qb','qb_median'])
df1.qb=['qb1','qb2']

df1
Out[76]: 
    qb qb_median
0  qb1       NaN
1  qb2       NaN

df2=pd.DataFrame({'sample':['A','B','C','D','E','F'],'x':[1,2,3,4,5,6]})

df2
Out[78]: 
  sample  x
0      A  1
1      B  2
2      C  3
3      D  4
4      E  5
5      F  6

sets={'qb1':['A','B','C'],'qb2':['D','E','F']}

我想填充 df1 这样

    qb qb_median
0  qb1       2
1  qb2       5

我认为可能有用的是:

def get_med(q, lookup_df):
     return lookup_df.loc[lookup_df['sample'].isin(sets[q])]['x'].median()

df1['qb_median']=df1.apply(lambda x: get_med(df1.qb, df2), axis=1)

我也尝试过以下变体:

df1['qb_median']=df2.loc[df2['sample'].isin(sets[df1.qb_median])]['x'].median()

我觉得我“就在那儿”,但就是无法让它发挥作用。任何帮助将不胜感激。

【问题讨论】:

    标签: python dataframe slice


    【解决方案1】:

    您可以尝试以下方法,希望对您有所帮助。

    df1.set_index('qb',inplace=True)
    
    for qb in df1.index.values:
        qb_median = df2[df2['sample'].isin(sets[qb])]['x'].median()
        df1['qb_median'][qb] = qb_median
    

    【讨论】:

    • 是的,这有点符合我提到的蛮力方法。几行很好,但我认为它不符合整个“不要迭代数据框”的思想。虽然这个特定的应用程序(示例的缩写)只有 6 行,但当我必须在更大的数据集上做类似的事情时,我要求更多。
    • 我已经编辑了答案以在 qb 上使用循环
    • 感谢您的 cmets 和编辑。当您第一次响应时,我假设了一个 for 循环。但是,它并没有完全解决我感兴趣的问题:有没有更好的方法来执行此操作而不循环数据帧?
    【解决方案2】:

    新建一列怎么样,用掩码知道列的值 然后使用groupby?第一部分仍然有点循环,但获取平均值的 groupby 更 Pythonic

    df2['qbgroup'] = ''
    df2.loc[((df2['sample']=='A') | (df2['sample']=='B') | (df2['sample']=='C')), 'qbgroup'] = 'qb1'
    df2.loc[((df2['sample']=='D') | (df2['sample']=='E') | (df2['sample']=='F')), 'qbgroup'] = 'qb2'
    foo = df2.groupby(df2['qbgroup']).mean()
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2023-01-17
      • 2020-09-16
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      相关资源
      最近更新 更多