как подсчитать количество поставок в дневном диапазоне - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть столбцы: ID, количество поставок, дней.

Я хочу дать значение 1 для идентификатора, который имеет количество поставок> = 100 в дни от 1 до 60, иначе 0.

Диапазон дней (-30,100)

каждый идентификатор имел строку записи в день, когда он получил supplies.eg ID (1), количество поставок (10), в день (-5).

то, что я пытался:

df.loc[(0<df.days)&(df.days<=60)]

groupby('id').sum()

np.where((supply counts>100) , '1', '0')

проблема в том, что если какой-либо идентификатор, у которого нет записи от дней 0 до 60, идентификатор будет отсутствовать.

образец данных.

  id    supply  days
    1   15   -10
    1   20    5
    1   325   15
    2   10    -20
    2   50    10
    3   20    -30






id  y            
1   1
2   0

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

первый фильтр по boolean indexing, затем агрегирование sum только для столбца supply, и, поскольку возможно, некоторые id значения отфильтрованы, добавьте Series.reindexна Series.unique значения оригинала.Последний Series.reset_index для преобразования Series в DataFrame и добавление нового столбца y с DataFrame.pop для извлечения supply:

df1 = df[(df.days > 0)&(df.days<=60)]
df2=df1.groupby('id')['supply'].sum().reindex(df['id'].unique(), fill_value=-1).reset_index()
df2['y'] = np.where(df2.pop('supply') > 100, 1, 0)
print (df2)
   id   y
0   1   1
1   2   0
2   3   0

РЕДАКТИРОВАТЬ: При необходимости удалить фильтр id строк:

df1 = df[(df.days > 0)&(df.days<=60)]
df2=df1.groupby('id', as_index=False)['supply'].sum()
df2['y'] = np.where(df2.pop('supply') > 100, 1, 0)
print (df2)
   id  y
0   1  1
1   2  0

Альтернативное решение:

df2 = (df.query("0 < days <=60") 
         .groupby('id')['supply'].sum()
         .reindex(df['id'].unique(), fill_value=-1)
         .rename('y')
         .gt(100)
         .astype(int)
         .reset_index()
       )
print (df2)
   id  y
0   1  1
1   2  0
2   3  

df2 = (df.query("0 < days <=60") 
         .groupby('id')['supply'].sum()
         .rename('y')
         .gt(100)
         .astype(int)
         .reset_index()
       )
print (df2)
   id  y
0   1  1
1   2  0
0 голосов
/ 26 сентября 2019

Как я понял, может быть, это то, что вам нужно.

s = (df.Days>0) & (df.Days<=60)
df['ID_new']= np.where ((s) & (df.supply_counts>=100), 1,0)

Вход

   ID   supply_counts   Days
0   1   135             -15
1   1   70               67
2   1   90               38
3   1   80               49
4   1   68               71
5   2   116              85
6   1   81               91
7   2   62               15
8   1   112               1 
9   1   115               65
10  2   87               51
11  1   105              -9
12  1   107               2
13  2   66               79
14  2   92               46

Выход


    ID  supply_counts   Days    ID_new
0   1   135             -15     0
1   1   70               67     0
2   1   90               38     0
3   1   80               49     0
4   1   68               71     0
5   2   116              85     0
6   1   81               91     0
7   2   62               15     0
8   1   112               1     1
9   1   115               65    0
10  2   87               51     0
11  1   105              -9     0
12  1   107               2     1
13  2   66               79     0
14  2   92               46     0

Если результат необходим, чтобы сумма каждого идентификатора равнялась 1, если сумма supply_counts> 100, тогда будет работать код, приведенный ниже.

df2 = df.groupby('id').sum().reset_index()
s = (df2.days>0) & (df2.days<=60)
df2['y']= np.where ((s) & (df2.supply>=100), 1,0)
df2[['id','y']]

Выход

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