Pandas - 跨 2 个数据帧的多个键上的 SUMIF 等效项

问题描述 投票:0回答:1

我正在尝试找到一种将数据帧组合在一起的好方法,在 Excel 中类似于 SUMIF(或多个 SUMIFS)。

我有以下两个数据框:

df = pd.DataFrame({ 'KEY_1': ['MF1020','MF1020','MF1540','MF5520','MF1525','MF6010'],
                    'KEY_2': ['MF0520','MF2020','MF2030','MF4520','MF1050','MF1020'],
                    'KEY_3': ['MF1020','MF2520','MF1020','MF2520','MF1020','MF1060'],
                    'KEY_COUNT1': [1,0.4,0,0,0.45,0.01],
                    'KEY_COUNT2': [0,0.3,0.9,0,0.05,0.01],
                    'KEY_COUNT3': [0,0.3,0.1,1,0.5,0.98],})


df1 = pd.DataFrame({'KEY': ['MF1020', 'MF0565', 'MF1540', 'MF5520', 'MF1525', 'MF6515', 'MF6010', 'MF0520','MF2020', 'MF2030', 'MF4520', 'MF1050', 'MF2520', 'MF1060'],
                    'KEY_COUNT': [0,0,0,0,0,0,0,0,0,0,0,0,0,0]})

在第一个数据帧中,KEY_1 链接到 KEY_COUNT1(对于 2、3 也是如此)。 在第二个数据帧中,KEY 列包含第一个数据帧中所有三个 KEY 列中的所有键,而且还包含输出应保持为零的其他键。 第一个数据帧中有很多重复键的实例。

我想对键等于第二个数据帧中的键的计数列进行求和。

我期望输出如下:

df_final = pd.DataFrame({   'KEY_1': ['MF1020', 'MF0565', 'MF1540', 'MF5520', 'MF1525', 'MF6515', 'MF6010', 'MF0520','MF2020', 'MF2030', 'MF4520', 'MF1050', 'MF2520', 'MF1060'],
                            'KEY_COUNT': [2.01,0,0,0,0.45,0,0.01,0,0.3,0.9,0,0.05,1.3,0.98]})

我考虑解决问题的方法是为每个 KEY/KEY_COUNT 组合创建一个数据帧,将它们附加在一起,然后进行某种查找以填充第二个数据帧中的值。一定有更好的解决方案!

python pandas merge sum sumifs
1个回答
0
投票

您可以使用 DataFrame.melt 方法将数据帧转换为长格式。

melted_df = df.melt( 
                    id_vars=[f'KEY_{i}' for i in range(4)], 
                    var_name='KEY_COUNT', 
                    value_name='COUNT')

然后从

KEY_COUNT
列中提取索引号。

melted_df['KEY_INDEX'] = melted_df['KEY_COUNT'].str.extract(r'(\d+)').astype(int)

查找对应的

KEY_*
列。

melted_df['KEY_INDEX'] = melted_df.apply(
    lambda row: row[f'KEY_{row["KEY_INDEX"]}'], axis=1)

对数据框进行分组并对值求和。

final_df = melted_df[['KEY_INDEX', 'COUNT']].groupby('KEY_INDEX', as_index=False).sum()
© www.soinside.com 2019 - 2024. All rights reserved.