Python 字典提供的数据帧的特定行的总和
我有一个带有一列键的数据框和一些其他列。我想合并数据帧中特定行的总和。字典提供了哪些行应该汇总在一起。此映射由{key:[其他键列表]}的字典提供 具体来说,下面是一些示例代码: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 = {
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你对我的问题的解答帮助了我的回答:这更快了。