我有两个数据框。第一个命名mergedcsv
的格式为: mergedcsv dataframepython dataframe groupby by dictionary list then sum
命名idgrp_df
第二数据帧是一个字典的格式,其对于每个区域编号对应的字符串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中的第一行,我希望选择标签为F95RR04
,F95RR06
和F95RR15
(从第一行idgrp_df中的列表中读取)的列。将这一行的这些列中的值相加,然后将总和值插入TotRegFlows
列。
任何想法如何我可以利用列表将非常感激。
编辑:
非常感谢IanS。您的解决方案很有用。根据这条建议修改了代码行之后,我意识到(如建议)我的两个数据框中的索引都不同步。我测试了索引(mergedcsv有'None',idgrp_df有'REG_ID'列作为索引,我也将mergedcsv设置为'REG_ID',然后意识到mergedcsv有582行(REG_ID不唯一),idgrp_df有220行(REG_ID是唯一的)我为此觉得我根据在mergedcsv REG_ID指数缺少GROUPBY 我已经修改了代码如下:。
mergedcsv.set_index('REG_ID', inplace=True)
print mergedcsv.index.name
print idgrp_df.index.name
mergedcsvgroup = mergedcsv.groupby('REG_ID')[mergedcsv.columns].apply(lambda y: y.tolist())
mergedcsvgroup['TotRegFlows'] = mergedcsvgroup.apply(lambda row: row[idgrp_df.loc[row.name]].sum(), axis=1)
我有一个KeyError异常:“REG_ID”
任何进一步的建议是最受欢迎的。将groupby组合并应用于一行会更有效率吗?
我是新来与大熊猫的工作,并试图在Python积累经验
进一步修订:
如果没有索引的mergedcsv:
,这将引发一个KeyError异常:(标签[0]不在[索引]中,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)
,这将引发一个类型错误:( “unhashable类型: '列表'”,在索引7' u'occurred)
或者最后分离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:不可用类型列表。轴= 1参数也不适用于groupby应用。
任何想法如何使用应用函数列表?我已经在应用代码中探索了元组,但没有取得任何成功。
任何建议非常感谢。
我的回答是否帮助您解决问题?随意要求澄清! – IanS
谢谢@IanS您的建议在比较两个数据框时非常有用。我意识到第一个数据帧需要groupby。我编辑了原文,以反映这些变化。但仍有列表错误。任何进一步的建议将非常感激。 –
第一个关键错误是因为一旦您将'REG_ID'设置为索引,该列就会被删除,您不能再对其进行分组。你可以这样做(使用'groupby(level = 0)'),但由于'REG_ID'不是唯一的,我不认为这是个好主意。 – IanS