Панды Д. Ф. Несколько условных выражений, использующих np.where - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь объединить несколько относительно простых условий в предложение np.where, но у меня возникают проблемы с синтаксисом логики.

Мой текущий фрейм данных выглядит как df ниже, с четырьмя столбцами.Я хотел бы добавить два столбца, названных ниже, со следующими условиями:

Требуемый вывод ниже - df df_so_v2

  1. Дни с момента активности * Найдите самую последнюю предыдущую строку с тем же идентификатором, затем вычтите столбец дат * Если нет последнего значения, верните NA

  2. Chg.Avg.Значение Условие 1: Если Count = 0, NA Условие 2: Если Count! = 0, найдите самую последнюю предыдущую строку с ОБА и тем же идентификатором и Count! = 0, затем найдите разницу в Avg.Столбец значения.

Однако я строю простые запросы np.where, подобные приведенным ниже, и не знаю, как объединить несколько условий, необходимых в этом случае.

df['CASH'] = np.where(df['CASH'] != 0, df['CASH'] + commission , df['CASH'])

Большое спасибо за помощь в этом.

df_dict={'DateOf': ['2017-08-07','2017-08-07','2017-08-07','2017-08-04','2017-08-04','2017-08-04'
                , '2017-08-03','2017-08-03','2017-08-03','2017-08-02','2017-08-02','2017-08-02','2017-08-01','2017-08-01','2017-08-01'],
    'ID': ['553','559','914','553','559','914','553','559','914','553','559','914','553','559','914'], 'Count': [0, 4, 5, 0, 11, 10, 3, 9, 0,1,0,2,4,4,0],
    'Avg. Value': [0,3.5,2.2,0,4.2,3.3,5.3,5,0,3,0,2,4.4,6.4,0]}
df_so=pd.DataFrame(df_dict)

df_dict_v2={'DateOf': ['2017-08-07','2017-08-07','2017-08-07','2017-08-04','2017-08-04','2017-08-04'
                , '2017-08-03','2017-08-03','2017-08-03','2017-08-02','2017-08-02','2017-08-02','2017-08-01','2017-08-01','2017-08-01'],
    'ID': ['553','559','914','553','559','914','553','559','914','553','559','914','553','559','914'], 'Count': [0, 4, 5, 0, 11, 10, 3, 9, 0,1,0,2,4,4,0],
    'Avg. Value': [0,3.5,2.2,0,4.2,3.3,5.3,5,0,3,0,2,4.4,6.4,0],
    'Days_since_activity': [4,3,1,1,1,2,1,2,1,1,1,1,'NA','NA','NA'],
    'Chg. Avg Value': ['NA',-0.7,-1.1,'NA',-0.8,1.3,2.3,-1.4,'NA',-1.4,'NA','NA','NA','NA','NA']
    }

df_so_v2=pd.DataFrame(df_dict_v2)

1 Ответ

0 голосов
/ 04 июня 2018

Вот ответ на эту часть вопроса.Мне нужно больше разъяснений относительно условий 2.

1) Дней с момента активности * Найдите самую последнюю предыдущую строку с тем же идентификатором, затем вычтите столбец дат * Если нет последнего значения, верните NA

Сначала вам нужно преобразовать строки в datetime, затем отсортировать даты в порядке возрастания.Наконец, используйте .transform, чтобы найти разницу.

df_dict={'DateOf': ['2017-08-07','2017-08-07','2017-08-07','2017-08-04','2017-08-04','2017-08-04'
                , '2017-08-03','2017-08-03','2017-08-03','2017-08-02','2017-08-02','2017-08-02','2017-08-01','2017-08-01','2017-08-01'],
    'ID': ['553','559','914','553','559','914','553','559','914','553','559','914','553','559','914'], 'Count': [0, 4, 5, 0, 11, 10, 3, 9, 0,1,0,2,4,4,0],
    'Avg. Value': [0,3.5,2.2,0,4.2,3.3,5.3,5,0,3,0,2,4.4,6.4,0]}
df_so = pd.DataFrame(df_dict)
df_so['DateOf'] = pd.to_datetime(df_so['DateOf'])

df_so.sort_values('DateOf', inplace=True)
df_so['Days_since_activity'] = df_so.groupby(['ID'])['DateOf'].transform(pd.Series.diff)
df_so.sort_index()

Отредактировано на основе вашего комментария: Найдите самый последний предыдущий день, в котором нет нуля, и рассчитайте разницу.

df_dict={'DateOf': ['2017-08-07','2017-08-07','2017-08-07','2017-08-04','2017-08-04','2017-08-04'
                , '2017-08-03','2017-08-03','2017-08-03','2017-08-02','2017-08-02','2017-08-02','2017-08-01','2017-08-01','2017-08-01'],
    'ID': ['553','559','914','553','559','914','553','559','914','553','559','914','553','559','914'], 'Count': [0, 4, 5, 0, 11, 10, 3, 9, 0,1,0,2,4,4,0],
    'Avg. Value': [0,3.5,2.2,0,4.2,3.3,5.3,5,0,3,0,2,4.4,6.4,0]}

df = pd.DataFrame(df_dict)
df['DateOf'] = pd.to_datetime(df['DateOf'], format='%Y-%m-%d')

df.sort_values(['ID','DateOf'], inplace=True)
df['Days_since_activity'] = df.groupby(['ID'])['DateOf'].diff()

mask = df.ID != df.ID.shift(1)
mask2 = df.groupby('ID').Count.shift(1) == 0

df['Days_since_activity'][mask] = np.nan
df['Days_since_activity'][mask2] = df.groupby(['ID'])['DateOf'].diff(2)

df['Chg. Avg Value'] = df.groupby(['ID'])['Avg. Value'].diff()
df['Chg. Avg Value'][mask2] = df.groupby(['ID'])['Avg. Value'].diff(2)

conditions = [((df['Count'] == 0)),]
choices = [np.nan,]
df['Chg. Avg Value'] = np.select(conditions, choices, default = df['Chg. Avg Value'])

# df = df.sort_index()
df

Новый несортированный вывод для легкого сравнения:

    DateOf  ID  Count   Avg. Value  Days_since_activity Chg. Avg Value
12  2017-08-01  553 4   4.4      NaT        NaN
9   2017-08-02  553 1   3.0      1 days     -1.4
6   2017-08-03  553 3   5.3      1 days     2.3
3   2017-08-04  553 0   0.0      1 days     NaN
0   2017-08-07  553 0   0.0      4 days     NaN
13  2017-08-01  559 4   6.4      NaT        NaN
10  2017-08-02  559 0   0.0      1 days     NaN
7   2017-08-03  559 9   5.0      2 days     -1.4
4   2017-08-04  559 11  4.2      1 days     -0.8
1   2017-08-07  559 4   3.5      3 days     -0.7
14  2017-08-01  914 0   0.0      NaT        NaN
11  2017-08-02  914 2   2.0      NaT        NaN
8   2017-08-03  914 0   0.0      1 days     NaN
5   2017-08-04  914 10  3.3      2 days     1.3
2   2017-08-07  914 5   2.2      3 days     -1.1

индекс 11 должен быть NaT, потому что самая последняя предыдущая строка имеет счетчик нуля, и нет ничего другого, чтобы сравнить его с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...