我有两个数据帧。第一个名为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中的第一行,我希望选择标签为F95RR04
、F95RR06
和{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代码中研究过元组,但没有取得任何成功。在
如有任何建议,不胜感激。在
如果我理解正确,我有一个简单的解决方案^{} :
设置
解决方案
我应用了一个lambda函数,该函数从
^{pr2}$lists
系列中获取要求和的列的列表:诀窍在于,当迭代行(
axis=1
)时,row.name
是数据帧df
的原始索引。我用它来访问lists
系列中的列表。在注意事项
这个解决方案假设两个数据帧共享相同的索引,这在您包含的屏幕截图中似乎不是这样。你必须解决这个问题。在
另外,如果
idgrp_df
是一个数据帧而不是一个序列,那么您需要用.loc
来访问它的值。在相关问题 更多 >
编程相关推荐