Построить DataFrame на основе сгруппированных по столбцу в Python - PullRequest
0 голосов
/ 10 февраля 2020

Исходя из приведенного ниже кода, я пытаюсь присвоить столбцу данных мой столбец, который сгруппирован по месяцам даты и работает хорошо:

all_together = (df_clean.groupby(df_clean['ContractDate'].dt.strftime('%B'))
                  .agg({'Amount': [np.sum, np.mean, np.min, np.max]})
                  .rename(columns={'sum': 'sum_amount', 'mean': 'avg_amount', 'amin': 'min_amount', 'amax': 'max_amount'}))

Но по какой-то причине, когда я пытаюсь отобразить результат (в любом виде, как график), он не может распознать мою «ContractDate» как столбец, а также любое из переименованных имен, таких как: «sum_amount».

Есть ли у вас какие-либо идеи, что проблема и что я пропускаю, как правило, для построения графиков данных?

Я пробовал приведенный ниже код для построения графиков, и он спрашивает меня, что такое «ContractDate» и что такое «sum_amount»!

all_together.groupby(df_clean['ContractDate'].dt.strftime('%B'))['sum_amount'].nunique().plot(kind='bar')
#or
all_together.plot(kind='bar',x='ContractDate',y='sum_amount')

Я действительно ценю ваше время

Приветствия, zA

1 Ответ

1 голос
/ 10 февраля 2020

Когда вы применяете функцию groupby к DataFrame, он делает столбец groupby индексом (ContractDate в вашем случае). Поэтому вам нужно сначала сбросить индекс, чтобы он стал столбцом.

df = pd.DataFrame({'month':['jan','feb','jan','feb'],'v2':[23,56,12,59]})
t = df.groupby('month').agg('sum')

Вывод:

       v2
month   
feb    115
jan    35

Итак, как вы видите, в качестве индекса вы получаете месяцы. Затем, когда вы сбрасываете индекс:

t.reset_index()

Выход:

    month   v2
0   feb     115
1   jan     35

Далее, когда вы применяете несколько функций agg к одному столбцу в groupby, он создает мультииндексированный фрейм данных. Так что вам нужно сделать это как одноуровневый индекс:

t = df.groupby('month').agg({'v2': [np.sum, np.mean, np.min, np.max]}).rename(columns={'sum': 'sum_amount', 'mean': 'avg_amount', 'amin': 'min_amount', 'amax': 'max_amount'})

    v2
sum_amount  avg_amount  min_amount  max_amount
month               
feb 115 57.5    56  59
jan 35  17.5    12  23

Он создал multiindex.Если вы проверяете t.columns, вы получаете

MultiIndex(levels=[['v2'], ['avg_amount', 'max_amount', 'min_amount', 'sum_amount']],
           labels=[[0, 0, 0, 0], [3, 0, 2, 1]])

Теперь используйте это:

t.columns = t.columns.get_level_values(1)
t.reset_index(inplace=True)

Вы получите чистый фрейм данных:

    month   sum_amount  avg_amount  min_amount  max_amount
0   feb       115          57.5       56          59
1   jan       35           17.5       12          23

Надеюсь, это поможет вам при построении графика.

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