Рой из панд с категориальными значениями, разделенными запятыми

#python #pandas #matplotlib #seaborn

Вопрос:

Я работаю с набором данных, который содержит категориальные ответы, разделенные запятыми, в своих столбцах, и пытаюсь построить диаграмму рассеяния, аналогичную приведенной ниже. Я думаю, что правильным подходом могло бы быть использование диаграммы скопления морских птиц, например: ax = sns.swarmplot(x="id", y="family", data=dftest) но результат далек от того, что я ищу. Я ищу несколько советов о том, как я могу работать над восстановлением аналогичного сюжета?

диаграмма рассеяния человеческих перспектив

примеры данных:

ID семья город нация Мир
1 на следующей неделе, через несколько лет на следующей неделе, через несколько лет продолжительность жизни целая жизнь детей
2 следующие несколько лет, всю жизнь целая жизнь детей следующие несколько лет на следующей неделе, через несколько лет, жизнь детей
3 на следующей неделе, через несколько лет продолжительность жизни целая жизнь детей целая жизнь детей
4 на следующей неделе, через несколько лет следующие несколько лет на следующей неделе, через несколько лет, всю жизнь, на следующей неделе, через несколько лет, жизнь детей
5 следующие несколько лет, всю жизнь целая жизнь детей целая жизнь детей продолжительность жизни
 figure source: Meadows, D., Meadows, D., Randers, J. and Behrens, W., 1972. The Limits to growth. A report for the club of Rome's project on the predicament of mankind. 1st ed. New York: Universe Books.
 

Ответ №1:

Насколько я знаю, ожидаемого результата, представленного на изображении, трудно достичь с помощью библиотеки графиков python, поэтому я попытался имитировать желаемый результат из swarmplot сиборна. Я надеюсь, что этот пост приведет к некоторым отличным ответам от опытных инженеров.

 import pandas as pd
import numpy as np
import io

data = '''
id family city nation world
1 "next week,next few years" "next week,next few years" lifetime "children's lifetime"
2 "next few years,lifetime" "children's lifetime" "next few years" "next week,next few years,children's lifetime"
3 "next week,next few years" lifetime "children's lifetime" "children's lifetime"
4 "next week,next few years" "next few years" "next week,next few years,lifetime," "next week,next few years,children's lifetime"
5 "next few years,lifetime" "children's lifetime" "children's lifetime" lifetime
'''
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
dfs = pd.concat([
    df['family'].str.split(',', expand=True).rename(columns={0:'family',1:'family'}),
    df['city'].str.split(',', expand=True).rename(columns={0:'city',1:'city'}),
    df['nation'].str.split(',', expand=True).rename(columns={0:'nation',1:'nation',2:'nation'}),
    df['world'].str.split(',', expand=True).rename(columns={0:'world',1:'world',2:'world'})
], axis=1)

dfs = dfs.unstack().to_frame(name='TIME').reset_index().rename(columns={'level_0':'SPACE'})
dfs['TIME'].replace('', np.NaN, inplace=True)
dfs.dropna(subset=['TIME'], inplace=True)

import seaborn as sns

ax = sns.swarmplot(x="TIME", y="SPACE", data=dfs, size=15)
ax.grid(which='minor', axis='both')
print(ax.get_ylim())
ax.set_ylim(-0.5, 3.5)

for y_pos in [0.5, 1.5, 2.5]:
    ax.axhline(y=y_pos, color='k', lw=0.8)

for x_pos in [0.5, 1.5, 2.5]:
    ax.axvline(x=x_pos, color='k', lw=0.8)
 

введите описание изображения здесь