我正在尝试编写一个函数来汇总并在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