Сюжетно.Многоиндексный столбец Express Pandas

#python #pandas #plotly

Вопрос:

Я относительно новичок в Панд и Сюжетно. Я задам свой вопрос напрямую с MWE о том, что я хочу сделать:

 import pandas import plotly.express as px  df = pandas.DataFrame(  {  'n': [1,1,1,1,2,2,2,3,3,3,4,4],  'x': [0,0,0,0,1,1,1,2,2,2,3,3],  'y': [1,2,1,1,2,3,3,3,4,3,4,5],  } )  mean_df = df.groupby(by=['n']).agg(['mean','std'])  fig = px.scatter(  mean_df,  x = ('x','mean'),  y = ('y','mean'),  error_y = ('y','std'), ) fig.show()  

Этот код делает не то, что я хочу. Фрейм mean_df данных выглядит следующим образом:

 x y   mean std mean std n  1 0 0.0 1.250000 0.500000 2 1 0.0 2.666667 0.577350 3 2 0.0 3.333333 0.577350 4 3 0.0 4.500000 0.707107  

Я хочу построить график x_mean vs y_mean с полосами ошибок в y, используя plotly.express . Я не уверен, как это сделать, когда во фрейме данных есть вложенные столбцы…

После некоторых исследований я обнаружил, что mean_df.columns = [' '.join(col).strip() for col in mean_df.columns.values] преобразует предыдущий кадр данных в

 x mean x std y mean y std n  1 0 0.0 1.250000 0.500000 2 1 0.0 2.666667 0.577350 3 2 0.0 3.333333 0.577350 4 3 0.0 4.500000 0.707107  

так что теперь я могу просто сделать

 fig = px.scatter(  mean_df,  x = 'x mean',  y = 'y mean',  error_y = 'y std', )  

для получения желаемого результата. Однако, несмотря на то, что это делает именно то, что я хочу сделать, мне кажется, что это не тот путь…

Ответ №1:

Аналогично вашему исследованию, выровняйте многоуровневые столбцы. Вы можете использовать нарезку индексов. Это действительно оставляет mean_df без изменений.

Дальнейшие обновления ниже. Plotly Express разработан как простой API. Это типичный случай использования для упрощения / структурирования фрейма данных, соответствующего понятию x, y, цвету, имени пользователя и т. Д. В виде столбцов, адресуемых в виде строк. Там, где используются столбцы с несколькими индексами, может быть передан ряд или массив. Два варианта этого показаны ниже.

 import pandas import plotly.express as px  df = pandas.DataFrame(  {  'n': [1,1,1,1,2,2,2,3,3,3,4,4],  'x': [0,0,0,0,1,1,1,2,2,2,3,3],  'y': [1,2,1,1,2,3,3,3,4,3,4,5],  } )  mean_df = df.groupby(by=['n']).agg(['mean','std'])  fig = px.scatter(  mean_df.loc[:,pd.IndexSlice[:,"mean"]].droplevel(1,1),  x = "x",  y = "y", ) fig   

использование нескольких ключей 1-го уровня

 fig = px.scatter(  mean_df.loc[:,pd.IndexSlice[:,"mean"]].droplevel(1,1),  x = "x",  y = "y",  error_y = mean_df.loc[:,("y","std")].values ) fig.show() px.scatter(  x = mean_df.loc[:,("x","mean")],  y = mean_df.loc[:,("y","mean")],  error_y = mean_df.loc[:,("y","std")] )  

Комментарии:

1. Спасибо за ваш ответ. Я проголосую за то, как он делает то, что я написал в вопросе. Однако я искал решение, которое не отбрасывало бы столбцы, так как я тоже хочу std , чтобы они отображались. Я обновлю свой вопрос, чтобы отразить это, извините.

2. обновлено, чтобы отразить поправку к вашему вопросу. ИМХО, хорошо оставаться простым, поэтому, если есть столбцы, на которые нельзя ссылаться строкой, вместо этого передайте серию или массив