Сгруппируйте блок-график из Pandas фрейма данных, где один столбец с данными с плавающей запятой, а другой столбец с категориальными данными - PullRequest
0 голосов
/ 21 марта 2020

На данный момент у меня есть pandas Dataframe с именем mergeDf (40 строк x 2 столбца) с типами столбцов с плавающей и категориальной категорией - см. Ниже.

NH01        float64
NH01cat    category
dtype: object

Я пытаюсь построить побочную боковое поле в морской зоне, которое будет иметь все значения из столбца NH01 на оси Y, и они должны быть распределены по категориям на основе их значения в NH01cat столбце. Мой окончательный кадр данных будет состоять из 42 столбцов, где каждые два соседних столбца будут количественными и категориальные данные, как показано в примере (например, NH01 - плавающий, NH01 - категориальный, NH02 - плавучий, NH02cat - категориальный и т. 1006 *

      NH01    NH01cat
0   0.428581    NacZ
1   0.425339    NacZ
2   0.428772    NacZ
3   0.425148    NacZ
4   0.428581    NacZ
5   0.433540    NacZ
6   0.422096    NacX
7   0.423431    NacX
8   0.432205    NacX
9   0.431824    NacX
10  0.424194    NacX`

Я пробую приведенную ниже строку кода:

ax=sns.boxplot(y=mergeDf['NH01'], hue="NH01cat",orient='v', data=mergeDf, linewidth=2.5)

, но в результате я получаю один боксплот.

Как можно сгруппировать блокпост на основе по имеющимся данным?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Если я правильно понял ваш вопрос сейчас, у вас есть такой фрейм данных:

N = 100
M = 5
df = pd.DataFrame()
for i in range(1,M+1):
    df[f'NH{i:02d}'] = np.random.normal(loc=i, size=(N,))
    df[f'NH{i:02d}cat'] = np.random.choice(['NacZ','NacX'], size=(N,))
print(df.head())

output:

       NH01 NH01cat      NH02 NH02cat      NH03 NH03cat      NH04 NH04cat  \
0  0.231058    NacZ  1.872279    NacZ  4.048766    NacX  3.869479    NacZ   
1  0.062530    NacX  1.210339    NacZ  3.374466    NacZ  2.827855    NacX   
2  1.146168    NacX  0.752690    NacZ  3.948877    NacZ  4.320780    NacZ   
3  0.266700    NacZ  0.874896    NacX  1.529101    NacX  3.448940    NacZ   
4  1.620292    NacX  0.689638    NacX  2.778528    NacX  4.590301    NacZ   

       NH05 NH05cat  
0  3.757337    NacX  
1  4.552330    NacZ  
2  5.188367    NacX  
3  5.067367    NacZ  
4  4.108142    NacZ  

, который вы хотели бы построить с помощью вложенных в оттенки ящиков.

Для этого вам необходимо преобразовать ваши данные из «широких» в «длинные». Возможно, есть более эффективный способ сделать это (возможно, отдельный вопрос для pandas expert), но вы можете использовать pd.wide_to_long(), если вы слегка измените имена столбцов:

import re
df2 = df.copy()
df2.columns = [re.sub('NH([0-9]{2})cat','cat-NH\\1',c) for c in df2.columns]
df2.columns = [re.sub('^NH([0-9]{2})$','val-NH\\1',c) for c in df2.columns]
df2['id'] = df.index
df2 = pd.wide_to_long(df2, ['val','cat'], j='NH', i='id', sep='-', suffix='NH\\d+')
df2 = df2.reset_index()

теперь df2 выглядит как это:

   id    NH       val   cat
0   0  NH01  0.231058  NacZ
1   1  NH01  0.062530  NacX
2   2  NH01  1.146168  NacX
3   3  NH01  0.266700  NacZ
4   4  NH01  1.620292  NacX

, который вы можете построить:

sns.boxplot(y="val",x="NH",hue='cat', data=df2)

enter image description here

0 голосов
/ 21 марта 2020

hue= можно использовать, только если у вас уже есть другой уровень x.

try:

ax=sns.boxplot(y='NH01', x="NH01cat",orient='v', data=mergeDf, linewidth=2.5)
...