#python #excel #pandas #dataframe
#python #преуспеть #pandas #фрейм данных
Вопрос:
Фрейм данных следующим образом
date state Deaths Cases Day Avg day of case
2020-03-01 AK 0 15.5000 1.0 1.0
2020-03-02 AK 0 28.4048 2.0 0.0
2020-03-03 AK 0 43.8333 3.0 0.0
2020-03-04 AK 0 60.8905 4.0 0.0
2020-03-05 AK 0 81.3548 5.0 0.0
Фрейм данных группируется по состоянию и дате. «Средний день обращения» в каждой группе состояний — это первый день в столбце «День». Первый день для каждого состояния — «03-01-2020». Если бы штат начал запись позже (например: Алабама начала запись 03-13-2020″ это был бы 13-й день в столбце «День». Я сделал это, потому что 03-01-2020 — это когда в большинстве состояний начались обращения. Для достижения вышеуказанного я выполнил следующий код:
df['date'] = pd.to_datetime(df['date'])
df = df.dropna()
df = df[df['date'] >= '03-01-2020']
# getting the day column
df['Day'] = df.groupby('state')['date'].rank(ascending=True)
#creating the avg day of case
df['Avg day of case'] = 0
#getting the first day to be the first day of the Avg day of case
df.loc[df.groupby('state')['date'].head(1).index, 'Avg day of case'] = df.loc[:,'Day']
Все было в порядке. Теперь самое сложное. Чтобы завершить «Средний день обращения», я хотел применить следующую формулу, которая учитывает день и случаи, чтобы выяснить, когда был средний день обращений.
for i in range(1, len(df)):
x = (((df.loc[i, 'Cases'] - df.loc[i-1, 'Cases']) * (df.loc[i, 'Day']- df.loc[i-1, 'Avg day of
case'])) / (df.loc[i, 'Cases'])) (df.loc[i-1, 'Avg day of case'])
df.loc[i, 'Avg day of case'] = round(x, 2)
Однако, когда я это делаю, я всегда получаю
Ошибка ключа: 0
Приведенное выше исключение было прямой причиной следующего исключения:
Хотя я не совсем понимаю, почему. Я упорядочил даты и сгруппировал по состоянию. После этого я применил код, который сделал бы первое значение каждой группировки состояний первым днем обращений. Это должно было избавить от проблемы деления на ноль. Что я делаю не так?
Вот пример листа Excel, где формула действительно работала. Заранее спасибо.
Комментарии:
1. вы можете использовать pandas. Series.shift , вместо использования
iloc
, например.df['cases'] - df[cases'].shift(periods=1)
2.
df['Avg day of case'] = (((df['Cases'] - df['Cases'].shift(periods=1)) * (df['Day']-df['Avg day of case'].shift(periods=1))) / (df['Cases'])) (df[ 'Avg day of case'].shift(periods=1))
Это то, что вы имеете в виду?3. Будет ли это применимо к каждой группировке?