Skip to main content
 首页 » 编程设计

python之Pandas 对字典提供的 Dataframe 的特定行求和

2025年05月04日11haluo1

我有一个包含一列键和其他一些列的数据框。我想合并(求和)数据框的特定行。哪些行应该加在一起由字典提供。此映射由 { key : [ list of other keys ] } 的字典提供。

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

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”。

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

请您参考如下方法:

您可以从字典中创建一个数据框,将键和值作为两个单独的列,将其与 mydf 连接,然后按键列(来自原始字典)分组并对列求和:

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 

keydf = pd.DataFrame([(g, k) for g, ks in idx_grouping_dict.items() for k in ks + [g]], columns=["GKey", "Key"]) 
 
keydf 
#GKey   Key 
#0  C     A 
#1  C     B 
#2  C     C 
#3  B     A 
#4  B     B 
#5  A     C 
#6  A     A 
 
keydf.merge(mydf) 
 
#GKey Key Col1 Col2 
#0  C   A    4   10 
#1  B   A    4   10 
#2  A   A    4   10 
#3  C   B    7   10 
#4  B   B    7   10 
#5  C   C    3    9 
#6  A   C    3    9 
 
keydf.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 

时间:

%%timeit 
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") 
# 100 loops, best of 3: 2.51 ms per loop 
 
%timeit 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() 
# 100 loops, best of 3: 3.22 ms per loop