#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. обновлено, чтобы отразить поправку к вашему вопросу. ИМХО, хорошо оставаться простым, поэтому, если есть столбцы, на которые нельзя ссылаться строкой, вместо этого передайте серию или массив