Python数据帧groupby按字典列表然后求和

时间:2016-06-09 12:57:08

标签: python list pandas dataframe

我有两个数据帧。第一个名为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中的第一行,我希望选择带有标签F95RR04F95RR06F95RR15的列(从idgrp_df第一行的列表中读取) 。对该行的这些列中的值求和,并将总和值插入TotRegFlows列。

关于我如何利用这份清单的任何想法都将非常感激。

编辑:

非常感谢IanS。您的解决方案很有用。在根据这个建议修改代码行之后,我意识到(如建议的那样)我的两个数据帧中的索引都不同步。我测试了索引(mergedcsv有'无'而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和apply组合成一行会更有效吗?

我是新手,使用pandas并尝试在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 :("不可用类型:'列表'",你'发生在索引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:unhashable类型列表。对于groupby apply,轴= 1参数也不可用。

我是如何将这些列表与apply函数一起使用的?我已经在应用代码中探索了元组,但没有取得任何成功。

任何建议都非常感谢。

1 个答案:

答案 0 :(得分: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系列中的列表。

备注

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

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