Применение определенной формулы к фрейму данных pandas

#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, где формула действительно работала. Заранее спасибо.

Лист 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. Будет ли это применимо к каждой группировке?