Вам просто нужно добавить условие if при подготовке трассировки и фактически проверить, есть ли данные в сводной таблице.Если данных нет, мы присваиваем пустой объект трассировке, см. Приведенный ниже минимальный рабочий пример, пожалуйста, дайте мне знать, если это решит вашу проблему!
import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()
df_plot = df = pd.DataFrame([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]], columns=["A", "B", "C"])
pv = pd.pivot_table(
df_plot,
index=['A'],
columns=["B"],
values=['C'],
aggfunc=sum,
fill_value=0)
if 2 in list(pv.columns.levels[1]):
trace1 = go.Bar(x=pv.index, y=pv[("C", 2)], name="Two")
else:
trace1 = {}
if 5 in list(pv.columns.levels[1]):
trace2 = go.Bar(x=pv.index, y=pv[("C", 5)], name="Five")
else:
trace2 = {}
py_offline.iplot({
'data': [trace1, trace2],
'layout':
go.Layout(
barmode='stack')
})
Дополнительные сведения:
Результат приведенного ниже кода сводной таблицы:
pv = pd.pivot_table(
df_plot,
index=['A'],
columns=["B"],
values=['C'],
aggfunc=sum,
fill_value=0)
Таким образом, когда вы делаете pv.columns
, мы получаем детали всех отдельныхстолбцы сводной таблицы, которая выглядит следующим образом.
pv.columns
MultiIndex (уровни = [['C'], [2, 4, 6, 8]], метки = [[0, 0, 0, 0], [0, 1, 2, 3]], names = [None, 'B'])
Вы можете просто создать цикл for для просмотра спискамассива параметров и примените проверку if condition
, описанную в предыдущем примере, и, наконец, нанесите ее на график, обратитесь к приведенному ниже коду и дайте мне знать, если есть какие-либо проблемы.
import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()
df_plot = df = pd.DataFrame([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]], columns=["A", "B", "C"])
pv = pd.pivot_table(
df_plot,
index=['A'],
columns=["B"],
values=['C'],
aggfunc=sum,
fill_value=0)
arr = []
params = [{'name': "Two", 'val': 2},{'name': "Five", 'val': 5}]
for param in params:
if param['val'] in list(pv.columns.levels[1]):
temp = go.Bar(x=pv.index, y=pv[("C", param['val'])], name=param['name'])
else:
temp = {}
arr.append(temp)
py_offline.iplot({
'data': arr,
'layout':
go.Layout(
barmode='stack')
})