我有两个数据帧。第一个名为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
和F95RR15
的列(从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函数一起使用的?我已经在应用代码中探索了元组,但没有取得任何成功。
任何建议都非常感谢。
答案 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
访问其值。