Изменение порядка данных в пандах для сгруппированных гистограмм - PullRequest
0 голосов
/ 05 октября 2018

У меня есть пандасный фрейм данных, который выглядит примерно так:

df = pd.DataFrame(data, columns=["property_1", "property_2", "value"], index=my_index)

my_index    property_1    property_2    value
<1, 1, 1>   "A"           "X"           ...
<1, 1, 1>   "A"           "Y"           ...
<1, 1, 2>   "A"           "X"           ...
<1, 1, 4>   "A"           "X"           ...
<1, 1, 4>   "A"           "Y"           ...
<1, 1, 4>   "B"           "X"           ...
<1, 1, 4>   "B"           "Y"           ...

Я хочу создать сгруппированную гистограмму, например:

desired group bar chart

Это довольно сложно, но в основном:

  1. Мне нужно уменьшить my_index до уникальных индексов, которые имеют значение для каждой комбинации property_1 и property_2
  2. Мне нужно найти уникальные комбинации property_1 И property_2, а не только уникальные значения каждого столбца в отдельности!
  3. Я пытаюсь сгруппировать их в основном по my_index, а затем по комбинации property_1 и property_2

Я бы догадался, что путь к этому заключается в наличии кадра данныхсо следующим макетом:

my_index    A-X    A-Y    B-X    B-Y    ... 
<1, 1, 1>   ...    ...    NaN    NaN    ...
<1, 1, 2>   ...    ...    NaN    NaN    ...

и так далее.Затем можно отбросить столбцы с любыми значениями NaN.Затем вы можете просто вызвать df.plot.bar(...) на этом результирующем фрейме данных.

Но я не уверен, как таким образом перегруппировать эти строки в столбцы.У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: Я должен отметить, что мне не нужно нужен ответ в пандах, я просто спрашиваю, есть ли такой.Если нет, я могу сам разобраться в данных.Но, возможно, у панд есть изящная однострочная для облегчения такой работы.

1 Ответ

0 голосов
/ 06 октября 2018

Возможно, я неправильно понял вашу проблему.Но позвольте мне предложить некоторые шаги, которые могут вам помочь.

Сначала добавьте один столбец unique_property из столбцов property_1 и property_2 и (если необходимо) отбросьте два последних.

df[`unique_property`] = df.property_1 + df.property_2
df.drop(['property_1', 'property_2'], axis=1, inplace=True)

Затем мы можем построить график данных, сгруппированный по my_index и unique_property.

fig, ax = plt.subplots()
ax.set_xticks(df['my_index'].unique()) # this sets x axis.
df.groupby(["my_index", "unique_property"]).mean()['value'].unstack().plot(kind='bar', ax=ax)

Пояснения к последней строке.

df.groupby(["my_index", "unique_property"]).mean()['value']

Приведенный выше код даст нам Серии value, сгруппированные по my_index и unique_property.Если мы непосредственно построим его, то получим всю комбинацию уникальных значений в (my_index, unique_property) в качестве оси x.Вот почему нам нужно

unstack().

Это похоже на то, что уникальные значения в my_index становятся строками, а уникальные значения в unique_property становятся столбцами.

По умолчанию он выдаст значение NaN для неполных данных, например, для my_index = <1,1,1> есть только AX и AY, которые имеют значение, тогда BX и BY будут заполнены значением NaN.Мы можем, например, заменить NaN на some_value, затем unstack(fill_value=some_value).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...