在来自另一个df的子集的中间值上填充df列

2024-09-28 21:57:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:一个表示样本块(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()

我觉得我就在那里,但就是不能让它工作。任何帮助都将不胜感激


Tags: sampledataframedfsetsoutlookuppdmedian
2条回答

如何创建一个新列,使用掩码来了解列的值 然后使用groupby?第一部分仍然有点荒谬,但是获得平均值的groupby更像python

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()

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

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

相关问题 更多 >