python - 如何通过对非标量值求和来将不同类型的字典转换为熊猫系列?
问题描述
我是熊猫的绝对初学者,所以下面的问题可能不是很相关。尽管如此:
鉴于我想使用以下数据创建一个 Series 对象:
from pandas import Series
data = {'c1' : 10, 'c2' : {'r1' : 1, 'r2' : 2}}
s = Series(data)
是否有可能以这样的方式操纵这个系列,结果是
print(s)
c1 10
c2 3
dtype: int64
总结内部字典中的所有条目(由 r1 和 r2 键组成)的结果是什么?
另一种选择可能是明确处理系列之外的情况。
解决方案
假设您的字典只有一个嵌套级别并且所有值都是数字,您可以将其展平如下:
data = {k: sum(v.values()) if type(v) == dict else v for k, v in data.items()}
如果您可能有多个级别,则可以使用一个短函数来对嵌套值求和:
import pandas as pd
def nested_itemsum(inp):
total = 0
if type(inp) == dict:
total = sum(nested_itemsum(v) for v in inp.values())
else:
total += inp
return total
data = {'c1' : 10, 'c2' : {'r1' : 1, 'r2' : 2}}
data = {k: nested_itemsum(v) for k, v in data.items()}
s = pd.Series(data)
print(s)
data = {'c1' : 10, 'c2' : {'r1' : {'x1': 5, 'x2': 10}, 'r2' : 2}}
data = {k: nested_itemsum(v) for k, v in data.items()}
s = pd.Series(data)
print(s)
这打印:
c1 10
c2 3
dtype: int64
c1 10
c2 17
dtype: int64
正如预期的那样。
如果您不想修改输入数据,可以将其应用于您创建的系列,如下所示:
data = {'c1' : 10, 'c2' : {'r1' : 1, 'r2' : 2}}
s = pd.Series(data)
s = s.apply(nested_itemsum)
并得到相同的结果。
推荐阅读
- java - 如何以 Map 形式获取数据
> 使用单个查询? - docker - 有没有办法在 docker-compose 的控制台中显示更少的服务日志?
- asp.net-core - 如果在我的 ASP.NET Core 5 Web 应用程序中通过 ajax 提交数据,KendoUI SignalR 网格不会更新
- python - 响应无效“应用程序/json”
- flutter - Flutter 聊天回复消息
- laravel - BaseController 中的函数 __construct
- highcharts - 在 Highcharts 中从柱形图钻取到饼图时隐藏轴
- ruby - Nokogiri:将 NodeSet 转换为 Hash
- flutter - 如何使选项卡和选项卡栏视图在颤动中动态化,以便它能够响应来自 api 的响应?
- c# - How to trigger button command whenever my value from combobox is selected