2016-06-09 81 views
1

我有两个数据框。第一个命名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,F95RR06F95RR15(从第一行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应用。

任何想法如何使用应用函数列表?我已经在应用代码中探索了元组,但没有取得任何成功。

任何建议非常感谢。

+0

我的回答是否帮助您解决问题?随意要求澄清! – IanS

+0

谢谢@IanS您的建议在比较两个数据框时非常有用。我意识到第一个数据帧需要groupby。我编辑了原文,以反映这些变化。但仍有列表错误。任何进一步的建议将非常感激。 –

+0

第一个关键错误是因为一旦您将'REG_ID'设置为索引,该列就会被删除,您不能再对其进行分组。你可以这样做(使用'groupby(level = 0)'),但由于'REG_ID'不是唯一的,我不认为这是个好主意。 – IanS

回答

0

如果我理解正确的话,我有apply一个简单的解决方案:

设置

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系列求和:

df.apply(lambda row: row[lists[row.name]].sum(), axis=1) 

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

注意

该解决方案假定两个dataframes共享相同的指数,这似乎不是你包括屏幕截图的情况。你必须解决这个问题。

此外,如果idgrp_df是数据帧而不是系列,则需要使用.loc访问其值。