根据 pandas 中的字典对数据帧的行进行分组并对相应的分子求和
Posted
技术标签:
【中文标题】根据 pandas 中的字典对数据帧的行进行分组并对相应的分子求和【英文标题】:Group rows of dataframe according to dictionary in pandas and sum corresponding numerators 【发布时间】:2021-12-18 19:03:32 【问题描述】:我有一个错误代码、分子及其分母的数据框,以及每个可能的错误代码及其总体错误类型的字典。我想按错误类型对数据框中的错误代码进行分组,将它们的分子相加,并保持分母列不变。我试过了
grouped = day1_xione.set_index('error_code').groupby(by=map_values,axis=1).sum().reset_index()
grouped
但它只保留错误代码并且不按类型对它们进行分组。这是数据样本的样子:
数据框:
error_code | Numerator | Denominator |
---|---|---|
POWER CYCLE ON | 5 | 10 |
POWER OFF | 1 | 10 |
PANIC - PANIC -PANIC_1 | 5 | 10 |
TEMP_HIGH-TEMP | 0 | 10 |
UNKNOWN-Reason_Unknown | 9 | 10 |
对于显示的错误代码,有 56 个错误。每个错误代码都是一个字符串,直接匹配字典中的代码。
字典:
map_values =
'POWER CYCLE ON' : 'POWER RESET',
'POWER OFF': 'POWER RESET',
'PANIC - PANIC -PANIC_1': 'DEVICE PANIC',
'TEMP_HIGH-TEMP': 'OTHER',
'UNKNOWN-Reason_Unknown': 'OTHER'
57 个代码和 10 种类型。
期望的输出:
error_code | Numerator | Denominator |
---|---|---|
POWER RESET | 6 | 10 |
DEVICE PANIC | 5 | 10 |
OTHER | 9 | 10 |
所有出现的错误代码
【问题讨论】:
【参考方案1】:您已经很接近了,您需要使用map
来groupby
映射值,并使用agg
进行不同功能的聚合(sum
和first
)
(df.groupby(df['error_code'].map(map_values))
.agg('Numerator': 'sum', 'Denominator': 'first')
.reset_index()
)
输出:
error_code Numerator Denominator
0 DEVICE PANIC 5 10
1 OTHER 9 10
2 POWER RESET 6 10
【讨论】:
谢谢!这似乎应该可以工作(我确实得到了我需要的列,但没有行),但我认为我仍然存在数据问题。即使在手动检查我的数据框和字典以确保错误代码匹配之后,python 也不会将它们识别为匹配项。我什至尝试只进行连接,但数据也不会与之合作。 请提供一个不起作用的例子和预期的输出 我能够通过将所有字符串全部转换为大写字母来解决此问题。以上是关于根据 pandas 中的字典对数据帧的行进行分组并对相应的分子求和的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用groups属性获取每个分组的样本对应的在原dataframe中的行索引位置列表