Python 字典提供的数据帧的特定行的总和

Python 字典提供的数据帧的特定行的总和,python,pandas,join,dataframe,merge,Python,Pandas,Join,Dataframe,Merge,我有一个带有一列键的数据框和一些其他列。我想合并数据帧中特定行的总和。字典提供了哪些行应该汇总在一起。此映射由{key:[其他键列表]}的字典提供 具体来说,下面是一些示例代码: data = [('A', 4, 10), ('B', 7, 10), ('C', 3, 9)] labels = ['Key','Col1','Col2'] mydf = pd.DataFrame(data,columns=labels) idx_grouping_dict = {

我有一个带有一列键的数据框和一些其他列。我想合并数据帧中特定行的总和。字典提供了哪些行应该汇总在一起。此映射由{key:[其他键列表]}的字典提供

具体来说,下面是一些示例代码:

data = [('A', 4, 10),
        ('B', 7, 10),
        ('C', 3, 9)]
labels = ['Key','Col1','Col2']
mydf = pd.DataFrame(data,columns=labels)

idx_grouping_dict = { 'A' : ['C'], 'B' : ['A'], 'C' : ['A', 'B']}


desired_result = pd.DataFrame(
        [('A', 7, 19),
         ('B', 11, 20),
         ('C', 14, 29)], columns=labels)
这里,索引为“A”的行添加到索引为“C”的行中,索引为“B”的行添加到索引为“A”的行中,索引为“C”的行添加到行“A”和“B”中


我相信有办法做到这一点!也许形成某种临时数据帧并使用巧妙的内部或外部连接?我被难住了。

您可以从字典中创建一个数据帧,将key和value作为两个单独的列,将其与mydf连接,然后按原始字典中的key列分组,并将列相加:

pd.DataFrame([(g, k) for g, ks in idx_grouping_dict.items() for k in ks + [g]], 
             columns=["GKey", "Key"]).merge(mydf).groupby("GKey", as_index=False).sum()

#GKey   Col1    Col2
#0  A      7      19
#1  B     11      20
#2  C     14      29
另一种选择:

val_df = mydf.set_index("Key")
pd.DataFrame.from_dict({g: val_df.loc[[g] + ks].sum() for g, ks in idx_grouping_dict.items()}, orient="index")

# Col1  Col2
#A   7    19
#B  11    20
#C  14    29
时间:


您可以从字典中创建一个数据帧,将key和value作为两个独立的列,将其与mydf连接,然后根据原始字典中的key列进行分组,并将列相加:

pd.DataFrame([(g, k) for g, ks in idx_grouping_dict.items() for k in ks + [g]], 
             columns=["GKey", "Key"]).merge(mydf).groupby("GKey", as_index=False).sum()

#GKey   Col1    Col2
#0  A      7      19
#1  B     11      20
#2  C     14      29
另一种选择:

val_df = mydf.set_index("Key")
pd.DataFrame.from_dict({g: val_df.loc[[g] + ks].sum() for g, ks in idx_grouping_dict.items()}, orient="index")

# Col1  Col2
#A   7    19
#B  11    20
#C  14    29
时间:


这是一个稍微慢一点的解决方案,它涉及首先转置数据帧,然后在转置回数据帧之前执行列式求和

# https://stackoverflow.com/a/45332338/4909087
In [457]: temp = mydf.T.rename_axis(None, axis=1)

In [456]: pd.DataFrame({k : temp[[k]].join(temp[[i for i in v]]).agg('sum', axis=1) for k, v in idx_grouping_dict.items()}).T
Out[456]: 
   Col1  Col2
A     7    19
B    11    20
C    14    29

这是一个稍微慢一点的解决方案,它涉及首先转置数据帧,然后在转置回数据帧之前执行列式求和

# https://stackoverflow.com/a/45332338/4909087
In [457]: temp = mydf.T.rename_axis(None, axis=1)

In [456]: pd.DataFrame({k : temp[[k]].join(temp[[i for i in v]]).agg('sum', axis=1) for k, v in idx_grouping_dict.items()}).T
Out[456]: 
   Col1  Col2
A     7    19
B    11    20
C    14    29
我的解决方案基于Dataframe

我的解决方案基于Dataframe


真棒的答案加1@Bharathshetty谢谢,这很聪明@MaxU感谢您的评论。@MaxU您对我问题的解答帮助了我的回答:速度更快。回答棒极了1@Bharathshetty谢谢,这很聪明@谢谢你的评论。@MaxU你对我的问题的解答帮助了我的回答:这更快了。