当前位置: 首页 > 面试题库 >

Pandas-GroupBy,然后在原始表上合并

屠锐
2023-03-14
问题内容

我正在尝试编写一个函数来汇总并在Pandas中的数据框上执行各种统计数据计算,然后将其合并到原始数据框,但是,我遇到了问题。这与SQL中的代码等效:

SELECT EID,
       PCODE,
       SUM(PVALUE) AS PVALUE,
       SUM(SQRT(SC*EXP(SC-1))) AS SC,
       SUM(SI) AS SI,
       SUM(EE) AS EE
INTO foo_bar_grp
FROM foo_bar
GROUP BY EID, PCODE

然后加入原始表:

SELECT *
FROM foo_bar_grp INNER JOIN 
foo_bar ON foo_bar.EID = foo_bar_grp.EID 
        AND foo_bar.PCODE = foo_bar_grp.PCODE

步骤如下:将数据加载到 :>>

pol_dict = {'PID':[1,1,2,2],
             'EID':[123,123,123,123],
             'PCODE':['GU','GR','GU','GR'],
             'PVALUE':[100,50,150,300],
             'SI':[400,40,140,140],
             'SC':[230,23,213,213],
             'EE':[10000,10000,2000,30000],
             }


pol_df = DataFrame(pol_dict)

pol_df

出:>>

   EID    EE PCODE  PID  PVALUE   SC   SI
0  123  10000    GU    1     100  230  400
1  123  10000    GR    1      50   23   40
2  123   2000    GU    2     150  213  140
3  123  30000    GR    2     300  213  140

步骤2:对数据进行计算和分组:

我的熊猫代码如下:

#create aggregation dataframe
poagg_df = pol_df
del poagg_df['PID']
po_grouped_df = poagg_df.groupby(['EID','PCODE'])

#generate acc level aggregate
acc_df = po_grouped_df.agg({
    'PVALUE' : np.sum,
    'SI' : lambda x: np.sqrt(np.sum(x * np.exp(x-1))),
    'SC' : np.sum,
    'EE' : np.sum
})

在我想加入原始表之前,此方法可以正常工作:

IN:>>

po_account_df = pd.merge(acc_df, po_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po'))

OUT:>> KeyError:您没有名为EID的项目

由于某种原因,分组的数据框无法联接回原始表。我已经研究了尝试将groupby列转换为实际列的方法,但这似乎不起作用。

请注意,最终目标是能够找到每一列(PVALUE,SI,SC,EE)IE的百分比:

pol_acc_df['PVALUE_PCT'] = np.round(pol_acc_df.PVALUE_Po/pol_acc_df.PVALUE_Acc,4)

谢谢!


问题答案:

默认情况下,groupby输出将分组列作为索引,而不是列,这就是合并失败的原因。

有几种不同的处理方法,最简单的方法可能是as_index在定义groupby对象时使用参数。

po_grouped_df = poagg_df.groupby(['EID','PCODE'], as_index=False)

然后,您的合并应该按预期方式工作。

In [356]: pd.merge(acc_df, pol_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po'))
Out[356]: 
   EID PCODE  SC_Acc  EE_Acc        SI_Acc  PVALUE_Acc  EE_Po  PVALUE_Po  \
0  123    GR     236   40000  1.805222e+31         350  10000         50   
1  123    GR     236   40000  1.805222e+31         350  30000        300   
2  123    GU     443   12000  8.765549e+87         250  10000        100   
3  123    GU     443   12000  8.765549e+87         250   2000        150

   SC_Po  SI_Po  
0     23     40  
1    213    140  
2    230    400  
3    213    140


 类似资料:
  • 问题内容: 例如,我有下表: 分组后: 我需要的是删除每个组中的行,其中列中的数量小于组中column的所有行中的最大值。好吧,我在将这个问题翻译和表达为英语时遇到了问题,因此这里是示例: 组中列中的行的最大值: 8 所以我想删除带有索引的行,并保留带有索引的行, 组中列中的行的最大值: 5 所以我想删除带有索引的行并保留带有索引的行 我尝试使用熊猫过滤器功能,但是问题是它一次在组中的所有行上运行

  • 问题内容: 我有以下数据框,并希望: 分组记录 点心和每一个独特的(每月) 在结果数据框中也包括其余的列 我想我能做到这一点的方法是1:创建一个聚合列,再总结的。 脚本: 当前数据帧: 所需输出: 实际输出: 问题: 如何包含每一行的月份? 如何包含数据框的其余列? 除了又如何求和? 问题答案: 具有功能 创建一个函数并将其传递给。您还需要防止组列成为输出中的索引。 毯 只需调用而无需任何列名。这

  • 问题内容: 所以我的数据框看起来像这样: 每个站点的分数因国家/地区而异。我正在尝试查找每个站点/国家/地区组合得分的1/3/5天差异。 输出应为: 我首先尝试按网站/国家/日期排序,然后按网站和国家/地区分组,但是我无法从分组对象中获得区别。 问题答案: 首先,对DataFrame排序,然后您需要做的是: 不支持任意排序。如果您需要进行任意排序(例如Google在fb之前),则需要将它们存储在集

  • 问题内容: 我有一个大文件(约19GB),我想加载到内存中以对某些列执行聚合。 该文件如下所示: 请注意,在加载到数据帧后,我正在使用列(id,col1)进行聚合,还请注意,这些键可能会连续重复几次,例如: 对于小文件,以下脚本可以完成此工作 但是,对于大文件,我在读取csv文件时需要使用chunksize来限制加载到内存中的行数: 在后一种情况下,如果将(id,col1)相似的行拆分到不同的文件

  • 问题内容: 我有一个这样的数据框说 和会话和收入的每个值代表了一种类型的,我要统计每个种类的数量表示的数量和的为1。 在无法输出所需结果后,我发现简单的调用函数。 我怎样才能做到这一点? 问题答案: 您似乎想一次按几列分组: 应该给你你想要的

  • 问题内容: 假设我有一个类似于下面的数据框,我将如何获取2个特定列之间的相关性,然后按“ ID”列分组?我相信Pandas的“ corr”方法可以找到所有列之间的相关性。如果可能的话,我也想知道如何使用.agg函数(即np.correlate)找到“ groupby”相关性。 是)我有的: 我需要的: 谢谢! 问题答案: 您几乎已经弄清楚了所有部分,只需将它们结合起来即可: 在您的情况下,为每个I