#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Это немного сложно объяснить, поэтому я начну с того, чего я пытаюсь достичь с помощью 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() для фрейма данных, что может ускорить его.