当前位置: 首页 > 知识库问答 >
问题:

熊猫:基于另一个数据帧中的映射,在特定列上分组并求和

西门淮晨
2023-03-14

如何使用数据帧对另一个数据帧的列执行groupby操作?

我有以下数据帧:

   |col1|col2|col3|col4|col5|col6|col7
--------------------------------------
0  |1   |10  |10  |100 |100 |10  |100
1  |1   |10  |10  |100 |100 |10  |100

   |name  |group
  ---------------
0  |col1  |group1
1  |col2  |group2
2  |col3  |group2
3  |col4  |group3
4  |col5  |group3
5  |col6  |group2
6  |col7  |group3

我想使用第二个数据帧上的映射来对第一个数据帧进行分组和求和。我想获得

   |group1|group2|group3
--------------------------
0  |1     |30    |300
1  |1     |30    |300

col2、col3和col6被求和在一起,因为它们被映射到组2。col4、col5和col7被求和在一起,因为它们被映射到组3。col1被映射到组1

要重新创建数据帧,请执行以下操作:

# initial dataframe
df = pd.DataFrame(
    {
        "col1": [1, 1],
        "col2": [10, 10],
        "col3": [10, 10],
        "col4": [100, 100],
        "col5": [100, 100],
        "col6": [10, 10],
        "col7": [100, 100],
    }
)
# dataframe containing all the mappings
mapping = pd.DataFrame(
    {
        "name": ["col1", "col2", "col3", "col4", "col5", "col6", "col7"],
        "group": ["group1", "group2", "group2", "group3", "group3", "group2", "group3"],
    }
)
# dataframe I want to obtain
final = pd.DataFrame(
    {
        "group1": [1, 1],
        "group2": [30, 30],
        "group3": [300, 300],
    }
)

共有1个答案

魏明亮
2023-03-14

使用索引。按列名称映射,然后聚合总和:

s = mapping.set_index('name')['group']

final = df.groupby(df.columns.map(s), axis=1).sum()
print (final)
   group1  group2  group3
0       1      30     300
1       1      30     300

或者先使用重命名,然后聚合:

s = mapping.set_index('name')['group']

final = df.rename(columns=s).groupby(level=0, axis=1).sum()
print (final)
   group1  group2  group3
0       1      30     300
1       1      30     300

如果映射中不存在值,则输出不同:

# dataframe containing all the mappings (removed last 2 values)
mapping = pd.DataFrame(
    {
        "name": ["col1", "col2", "col3", "col4", "col5"],
        "group": ["group1", "group2", "group2", "group3", "group3"],
    }
)

s = mapping.set_index('name')['group']

#only matched values are processing
final = df.groupby(df.columns.map(s), axis=1).sum()
print (final)
   group1  group2  group3
0       1      20     200
1       1      20     200

#not matched columns are added to ouput and not changed
final = df.rename(columns=s).groupby(level=0, axis=1).sum()
print (final)
   col6  col7  group1  group2  group3
0    10   100       1      20     200
1    10   100       1      20     200

 类似资料:
  • 我正面临这个问题,其中我有一个数据帧,比如: 和另一个数据帧: 现在我想要的是,将df2的列插入到df1的特定位置,这样df1就变成了(实际上一个新的df也会起作用): 我现在通过创建一个新的空df来实现这一点,然后迭代这两个df的列,然后依次添加每一列。这是低效的、丑陋的,并且违背了数据流的全部目的。所以我很想知道,这个已经有方法了吗?我不确定这样的问题是否已经在这里得到了回答,但我肯定我没有找

  • 问题内容: 我必须合并两个数据框: df1 df2 我必须将两个数据框统一为一个数据框。我需要像这样的输出: 问题答案: 用途: 样品:

  • 我有两个熊猫数据框 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'cal2'值 我的预期输出如下所示: 以下基于其他stackflow

  • 我有以下数据帧: 我需要删除等于的行。最有效的方法是什么?

  • 我有两个数据帧,其中一列名为。数据帧是从两名参与者同时录制的两个视频中提取的数据。由于跟踪失败,数据缺少一些帧(每个视频不同)。我想根据帧整数值取一个交点。 这里发布了一个类似的问题:熊猫——基于列条目的两个数据帧的交集,但接受的答案是连接,而不是交集。 已删除的行不在和 (我可以重置索引后,我完成处理) 我想首先得到两个数据帧的帧列的交集: 错误: 在获得两个数据帧中的帧索引后,我考虑执行以下操

  • 我有点被困在提取一个变量的值和另一个变量的条件上。例如,以下数据帧: 当时,如何获取的值?每次提取的值时,都会得到一个对象,而不是字符串。