python - 提高 Pandas 数据透视图的可读性
问题描述
我有一个包含 [910 行 x 1 列] 的数据透视表。当用 pandas plot 绘制时,可读性不好。请看下图。我想把它作为一个 Excel 数据透视图。我的意思是如果我单击图表中的特定点,它应该显示所有详细信息[Device_ID、Temp 等]。
请查看我的数据框(数据透视表)。
Frequency 0.8 1.6
Device_ID Temp Supply
FF_2649 -40.0 1.65 -100.72 -101.35
1.71 -100.61 -101.74
1.80 -100.74 -101.64
1.89 -100.63 -101.69
3.60 -100.60 -101.46
... ... ...
TT_2441 85.0 1.65 -94.99 -94.97
1.71 -94.85 -95.24
1.80 -95.02 -94.97
1.89 -94.69 -96.20
3.60 -94.90 -94.91
你能告诉我如何提高可读性吗?
我可以知道有什么方法可以将其绘制为 excel 文件。
解决方案
- 针对多索引合成数据以类似于问题
- 使用plotly作为您的绘图后端工具提示是解决方案的一部分
- 目前不支持多索引,所以我改为连接索引来演示
import pandas as pd
import numpy as np
df = pd.DataFrame(index=pd.MultiIndex.from_product([list("abcd"), list("efgh"), list("xyz")], names=["cat1","cat2","cat3"]))
df["value"] = np.random.randint(1,200, len(df))
pd.options.plotting.backend = "plotly"
df.reset_index().pipe(lambda d: d.set_index(d.cat1+d.cat2+d.cat3)).loc[:,"value"].plot()
使用带有多索引的 plotly API
- 需要将多索引组合成x
- 从您的评论中,我假设也有多个列。为每列生成一个散点图
import pandas as pd
import numpy as np
import plotly.graph_objects as go
s = 100000
df_new = pd.DataFrame({"Device_ID":np.random.choice(["FF_2649","FF_2700","FF_2800","TT_2000","TT_2100","TT_2441"], s),
"Temp":np.random.randint(-8, 19, s)*5,
"Supply":np.random.choice([1.65,1.71,1.80,1.89,3.60], s),
"Frequency":np.random.choice([0.8,1.6], s),
"NoiseLevel":np.random.uniform(-102,-94, s)
})
multi_index = pd.pivot_table(df_new, index = ['Device_ID', 'Temp' ,'Supply'],columns = 'Frequency', values = 'NoiseLevel',)
# given data is randmoly generated, give it some order...
multi_index.loc[:,[0.8,1.6]] = multi_index.assign(p=lambda d: (d[0.8]*2)+(d[1.6]*.5)).sort_values("p").drop(columns="p").values
# pivot gives a column per frequency. SO question did not indicate this....
# generate a line for each column in pivot table. concat values of multi-index to make it work with plotly
data = [go.Scatter(x=[" ".join([str(p) for p in x]) for x in multi_index.index], y=multi_index[c],
mode='lines+markers', name=f'Noise Level {c}', marker={"size":10},line={"dash":"dot"})
for c in multi_index.columns]
layout=go.Layout(title='Noise Level')
figure=go.Figure(data=data,layout=layout)
figure
推荐阅读
- javascript - 在javascript中将函数作为参数传递
- sql - 有没有办法剖析 sql 查询以获取表名、列、连接条件和过滤条件
- c# - .Net Core WindowsIdentity 模拟似乎不起作用
- sql - JSON 对象键的逗号分隔列表
- html - 在 hugo 中添加多色自定义图标
- android - okHttp 调用在应用程序中有效,但在服务中无效 - 因 ConnectException 失败:网络无法访问
- javascript - 在jquery selectable中拖动非选定的div
- node.js - InsertOne 一个对象数组到 Mongodb node.js 中不起作用
- javascript - 如何制作一个根据 Lottie 动画进度更新的 Slider (React-Native)
- guid - 如何将 GUID 转换为 int32?