Я применил метод groupby к моему фрейму данных df, чтобы получить среднее значение для каждого значения моего столбца X (в процентах)

df1 = df.groupby('percentage')['ratio'].mean()

То есть для каждого процентного значения у меня есть среднее значение отношения (потому что у меня было много точек данных).

Теперь я хочу построить новый процент (X) против новых значений отношения (Y), но не могу как-то. df1 [:, 0] выдает мне сообщение об ошибке, как будто это не вызов write для моего первого столбца.

Как я мог построить эти 2 столбца?

Это вывод df1:

percentage
0.000000    0.987699
0.000144    0.974359
0.000461    0.930000
0.001427    0.880549
0.006119    0.968185
0.008497    0.968686
0.017821    0.970008
0.028747    0.976759
0.030128    0.975607
0.038823    0.979795
0.043440    0.979847
Name: ratio, Length: 61, dtype: float64
0
PandasKoala 29 Июн 2019 в 15:51

4 ответа

Лучший ответ

Ну, это действительно странно, но df1 - это серия, а не датафрейм. строка слева - это индекс серии, а справа - значения, поэтому print(df[0.017821]) напечатает 0.970008, вы все равно можете получить доступ к этим значениям

percentage = list(df1.index)
ratio = df1.values

Вот почему вы получили сообщение об ошибке, серии имеют одну ось

1
rotem tal 29 Июн 2019 в 13:27

df1 является pandas.Series. С пандами можно использовать maplotlib со встроенными функциями, такими как

2
Mabel Villalba 29 Июн 2019 в 13:39

Вы не можете получить доступ к определенным столбцам, потому что имеете дело с сериями, а не с фреймом данных.

type(df.groupby('percentage')['ratio'].mean())
# pandas.core.series.Series

Я думаю, .reset_index() должен помочь, так как он преобразует ваши результаты в фрейм данных

type(df.groupby('percentage')['ratio'].mean().reset_index())
# pandas.core.frame.DataFrame

Итак, когда вы используете .reset_index(), вы можете назначать столбцы переменным:

new_df = df.groupby('percentage')['ratio'].mean().reset_index()
x, y = (new_df['percentage'], new_df['ratio'])
1
political scientist 29 Июн 2019 в 13:50

Просто заговор df1.

import random
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

p = [.1,.2,.3,.4,.5,.6,.7, .8,.9]
p = [random.choice(p) for _ in range(180)]
r = np.linspace(.001, .999, num=180)

df = pd.DataFrame({'pct':p, 'ratio':r})
df1 = df.groupby('pct')['ratio'].mean()
df1.plot()
plt.show()
plt.close()
1
wwii 29 Июн 2019 в 13:42