Python数据帧按字典列表分组,然后求和

2024-06-16 12:34:00 发布

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

我有两个数据帧。第一个名为mergedcsv的格式是: mergedcsv dataframe

第二个名为idgrp_df的数据帧是字典格式的,对于每个区域Id,都有一个对应字符串Id的列表。 idgrp_df dataframe - keys with lists

对于mergedcsv中的每一行(以及idgrp_df中的相应行),我希望选择mergedcsv中的列,其中列标签等于该行的idgrp_df的列表。然后将这些特定值的值求和,并将输出添加到mergedcsv中的列中。该函数将遍历mergedcsv中的所有行(582行x 600列)。在

我尝试这样做的代码行是:

mergedcsv['TotRegFlows'] = mergedcsv.groupby([idgrp_df],as_index=False).numbers.apply(lambda x: x.iat[0].sum())

它返回一个ValueError: Grouper for class pandas.core.frame.DataFrame not 1-dimensional.

这与groupby的输入数据帧有关。如何访问作为groupby输入的每一行的列表?在

例如,对于mergedcsv中的第一行,我希望选择标签为F95RR04F95RR06和{}(从idgrp_df第一行的列表中读取)的列。将该行的这些列中的值求和,然后将总和值插入TotRegFlows列中。在

如有任何关于我如何利用这份名单的想法,我将不胜感激。在

编辑:

非常感谢伊恩。你的解决方案很有用。根据这个建议修改了代码行之后,我意识到(正如建议的那样)我在两个数据帧中的索引不同步。我测试了索引(mergedcsv有“None”,idgrp_df有“REG_ID”列作为索引。我还将mergedcsv设置为“REG_ID”。然后意识到mergedcsv有582行(REG_ID不唯一),idgrp_df有220行(REG_ID是唯一的)。因此,我认为我缺少了一个基于mergedcsv中的REG_ID索引的groupby。 我已将代码修改如下:

^{pr2}$

我有一个键错误:'REG_ID'。在

欢迎提出进一步的建议。将groupby和apply合并成一行会更有效吗?在

我刚开始和熊猫一起工作,尝试用python建立经验

进一步修正:

没有mergedcsv的索引:

mergedcsv['TotRegFlows'] = mergedcsv.apply(lambda row: row[idgrp_df.loc[row.name]].groupby('REG_ID').sum(), axis=1)

这将引发一个KeyError:(标签[0]不在[index]中,u'发生在索引0')

使用mergedcsv的索引:

mergedcsv.set_index('REG_ID', inplace=True)
columnlist = list(mergedcsv.columns.values)
mergedcsv['TotRegFlows'] = mergedcsv.apply(lambda row: row[idgrp_df.loc[row.name]].groupby('REG_ID')[columnlist].transform().sum(), axis=1)

这将引发一个TypeError:(“unshable type:'list',u'occurred at index 7')

或者最后分离groupby函数:

columnlist = list(mergedcsv.columns.values)
mergedcsvgroup = mergedcsv.groupby('REG_ID')
mergedcsv['TotRegFlows'] = mergedcsvgroup.apply(lambda row: row[idgrp_df.loc[row.name]].sum())

这将抛出一个TypeError:unshable type list。axis=1参数在groupby apply中也不可用。在

有什么办法我可以使用列表与应用功能?我在apply代码中研究过元组,但没有取得任何成功。在

如有任何建议,不胜感激。在


Tags: 数据lambda代码iddf列表indexreg
1条回答
网友
1楼 · 发布于 2024-06-16 12:34:00

如果我理解正确,我有一个简单的解决方案^{}

设置

import pandas as pd

df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6], 'C': [7,8,9]})
lists = pd.Series([['A', 'B'], ['A', 'C'], ['C']])

解决方案

我应用了一个lambda函数,该函数从lists系列中获取要求和的列的列表:

^{pr2}$

诀窍在于,当迭代行(axis=1)时,row.name是数据帧df的原始索引。我用它来访问lists系列中的列表。在

注意事项

这个解决方案假设两个数据帧共享相同的索引,这在您包含的屏幕截图中似乎不是这样。你必须解决这个问题。在

另外,如果idgrp_df是一个数据帧而不是一个序列,那么您需要用.loc来访问它的值。在

相关问题 更多 >