Помещение только необходимых данных во фрейм данных на каждой итерации al oop in pandas python - PullRequest
0 голосов
/ 02 августа 2020

Мои данные содержат столбцы:

           |  Area_code  | ProductID  | Stock
Date       ----------------------------------
2016-04-01 |    920      | 100000135    2.000
2016-05-01 |    920      | 100000135    4.125
2016-06-01 |    920      | 100000135    7.375
2016-07-01 |    920      | 100000135    7.000
2016-08-01 |    920      | 100000135    4.500
2016-09-01 |    920      | 100000135    2.000
2016-10-01 |    920      | 100000135    6.175
2016-11-01 |    920      | 100000135    4.750
2016-12-01 |    920      | 100000135    2.625
2017-01-01 |    920      | 100000135    1.625
2017-02-01 |    920      | 100000135    4.500
2017-03-01 |    920      | 100000135    4.625
2017-04-01 |    920      | 100000135    1.000  
2016-04-01 |    920      | 100000136    0.100
2016-06-01 |    920      | 100000136    0.075
2016-07-01 |    920      | 100000136    0.200
2016-09-01 |    920      | 100000136    0.100
2017-03-01 |    920      | 100000136    0.050
2017-05-01 |    920      | 100000136    0.100
2017-06-01 |    920      | 100000136    0.025
2018-05-01 |    920      | 100000136    0.125
2018-08-01 |    920      | 100000136    0.200
2018-12-01 |    920      | 100000136    0.050
2019-02-01 |    920      | 100000136    0.100
2019-03-01 |    920      | 100000136    0.050

Данные представлены в Pandas фрейме данных с индексом столбца «Дата». Требуется перебрать этот фрейм данных и получить только те строки в другом фрейме данных (внутри al oop), который имеет такие же «Area_Code» и «Product_ID», чтобы получить результат как:

(скажем , на итерации 1 l oop для пары (920, 100000135)) фрейм данных в l oop должен вернуть:

              Stock
Date          -----
2016-04-01 |  2.000
2016-05-01 |  4.125
. 
. 
.
2017-04-01 |  1.000

(Затем на 2 итерации l oop, для пары (920, 100000136)) фрейм данных в l oop должен возвращать:

              Stock
Date          -----
2016-04-01 |  0.100
2016-06-01 |  0.075
. 
. 
.
2019-03-01 |  0.050

Кроме того, если мой фрейм данных, сгенерированный выше [т.е. в результате пары (Area_code, ProductID)], имеет номер записей меньше 12, я хочу пропустить эту итерацию и вернуть мне значения на следующей итерации.

Пожалуйста, помогите с этим требованием. Пожалуйста, укажите, если что-то неясно в вопросе. Большое спасибо.

1 Ответ

0 голосов
/ 02 августа 2020

Я бы предложил что-то вроде ниже

import pandas as pd

df = pd.DataFrame({'Date': ['10/02/2020', '27/01/2020', '27/04/2020', '26/03/2020', '21/02/2020', '07/06/2020',
                            '12/04/2020'],
                   'Area_code': [920, 920, 920, 920, 921, 921, 921],
                   'product_id': [13, 13, 13, 13, 16, 16, 16],
                   'stok': [1, 2, 3, 4, 6, 7, 8]})


def extract(ac, pi):
    #Filter the desired area code and product (e.g., 920, 100000136) pair)
    rslt_df = df[(df['Area_code'] == ac) & (df['product_id'] == pi)]

     # assign [] if records less than 12, you can delete the list later if it is equal to []
    return rslt_df[['Date', 'stok']] if rslt_df.shape[0] > 3 else None

Area_code = [920, 921]
product_id = [13, 16]

append_data=[extract(a, b) for (a, b) in zip(Area_code, product_id)]

#Remove None
all_report = [x for x in append_data if x is not None]
...