我有一个包含一列键和其他一些列的数据框。我想合并(求和)数据框的特定行。哪些行应该加在一起由字典提供。此映射由 { 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
