Фрейм данных Python Pandas вычисляет новое значение строки на основе предыдущего значения строки в том же столбце

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Это немного сложно объяснить, поэтому я начну с того, чего я пытаюсь достичь с помощью Excel.

Пример Excel

По сути, значение столбца «Active» основано на значениях одной и той же строки, разных значениях столбцов (столбцы «Количество действий» и «Количество действий»), а также на значении в предыдущей строке столбца «Active».

Из формулы Excel, если ‘Act Count’ <4 и ‘De Count’ <4, ‘Active’ = ‘Активное’ значение предыдущей строки.

Я хочу перенести это в фрейм данных Python pandas.

Вот пример данных:

 import pandas as pd

df = pd.DataFrame({'Act Count':[1,2,3,4,0,0,0,0,0,0,0,0,0,0],
              'De Count':[0,0,0,0,0,0,0,0,1,2,3,4,5,6]})
  

Вы можете принять значение первой строки ‘Active’ = 0.

Я знаю о функции .shift(), однако я чувствую, что не могу ее использовать, потому что я не могу сдвинуть столбец, который еще не существует.

Комментарии:

1. Работает ли мой ответ для вас?

Ответ №1:

Это не элегантное решение, но оно выполнит свою работу.

 import pandas as pd

act_count = [1,2,3,4,0,0,0,0,0,0,0,0,0,0]
de_count = [0,0,0,0,0,0,0,0,1,2,3,4,5,6]

active = [0]
for i in range(1:len(act_count)):
    if act_count[i] >= 4:
       active.append(100)
    elif de_count[i] >= 4 :
       active.append(0)
    else:
       active.append(active[i-1])

df = pd.DataFrame({'Act Count': act_count, 'De Count' : de_count, 
              'Active' : active})
  

Комментарии:

1. Спасибо, это работает, однако — извините, что я не упомянул об этом — но мои данные уже находятся в фрейме данных примерно из 4000 строк. Не уверен, что это лучший способ обработать это. Кроме того, значение ‘4’, которое я сохранил постоянным в этом примере, на самом деле является другим столбцом в фрейме данных, который может измениться. Я думаю, я могу просто использовать «list(df[‘column_name’]) для всех столбцов и создает списки для использования вашего решения. Просто сейчас это не кажется идеальным. Спасибо! Я подожду, чтобы узнать, есть ли у кого-нибудь еще лучшее решение с использованием pandas.

Ответ №2:

Вы можете использовать этот метод:

 ##Adding an empty column named Active to the existing dataframe
df['Active'] = np.nan

##putting the first value as 0
df['Active'].loc[0] = 0 

for index in range(1,df.shape[0]):
    if df['Act Count'].iloc[index]>=4:
        df['Active'].iloc[index]=100
    elif df['De Count'].iloc[index]>=4:
        df['Active'].iloc[index]=0
    else:
        df['Active'].iloc[index]=df['Active'].iloc[index-1]
print(df)
  

Выходной сигнал:

    Act Count    De Count    Active
0   1           0           0.0
1   2           0           0.0
2   3           0           0.0
3   4           0           100.0
4   0           0           100.0
5   0           0           100.0
6   0           0           100.0
7   0           0           100.0
8   0           1           100.0
9   0           2           100.0
10  0           3           100.0
11  0           4           0.0
12  0           5           0.0
13  0           6           0.0
  

Комментарии:

1. Этот ответ также работает, однако при применении к полному фрейму данных > 4000 строк это заняло до 90 секунд, тогда как другой метод с использованием списков занял около 1 секунды.

2. вы пробовали поместить это в функцию, а затем использовать .apply() для фрейма данных, что может ускорить его.