如何将同弹窗的两行表格数据合并为一行?
解决同一弹窗按钮数据合并到单行的问题
当前数据表格
| type | button_name | primary | secondary | type_name |
|---|---|---|---|---|
| 1 | name1_1 | 23 | 0 | type1_name |
| 1 | name1_2 | 0 | 50 | type1_name |
| 1 | name1_3 | 27 | 0 | type2_name |
| 1 | name1_4 | 0 | 8 | type2_name |
| 2 | name2_1 | 78 | 0 | type3_name |
| 2 | name2_2 | 0 | 29 | type3_name |
期望结果表格
| type | first | secondary | primary | secondary | type_name |
|---|---|---|---|---|---|
| 1 | name1_1 | name1_2 | 23 | 50 | type1_name |
| 1 | name1_3 | name1_4 | 27 | 8 | type2_name |
| 2 | name2_1 | name2_2 | 78 | 29 | type3_name |
1. SQL 解决方案
如果数据存储在数据库中,可通过GROUP BY按type和type_name分组,结合聚合函数提取对应按钮名称和数值:
SELECT type, MAX(CASE WHEN primary > 0 THEN button_name END) AS first, MAX(CASE WHEN secondary > 0 THEN button_name END) AS secondary, MAX(primary) AS primary, MAX(secondary) AS secondary, type_name FROM your_table GROUP BY type, type_name ORDER BY type, type_name;
说明:利用CASE语句筛选出primary/secondary按钮的名称,再用MAX聚合取非空值——同一组内只有一个按钮对应非零的primary/secondary值。
2. Excel/Google Sheets 解决方案
方法一:合并计算
- 选中空白区域作为结果输出位置
- 点击「数据」→「合并计算」
- 函数选择「最大值」,添加数据区域,勾选「最左列」和「首行」作为标签,确定后补充按钮名称列即可
方法二:公式匹配
假设原始数据在A1:E7区域,在G2单元格输入公式获取primary按钮名称(按Ctrl+Shift+Enter触发数组公式):
=INDEX($B$2:$B$7,MATCH(1,($A$2:$A$7=$G2)*($C$2:$C$7>0),0))
同理修改条件,可获取secondary按钮名称和对应数值。
3. Python Pandas 解决方案
用pandas分组聚合处理:
import pandas as pd # 构造数据(实际可通过read_csv/read_sql读取) df = pd.DataFrame({ 'type': [1,1,1,1,2,2], 'button_name': ['name1_1','name1_2','name1_3','name1_4','name2_1','name2_2'], 'primary': [23,0,27,0,78,0], 'secondary': [0,50,0,8,0,29], 'type_name': ['type1_name','type1_name','type2_name','type2_name','type3_name','type3_name'] }) # 分组聚合 result = df.groupby(['type', 'type_name']).agg( first=('button_name', lambda x: x[df.loc[x.index, 'primary']>0].iloc[0]), secondary=('button_name', lambda x: x[df.loc[x.index, 'secondary']>0].iloc[0]), primary=('primary', 'max'), secondary_count=('secondary', 'max') ).reset_index() # 调整列顺序 result = result[['type', 'first', 'secondary', 'primary', 'secondary_count', 'type_name']] print(result)
运行后即可得到期望的合并结果。
内容的提问来源于stack exchange,提问作者leah
相关产品推荐
相关产品推荐

