Привет, у меня есть DataFrame на python pandas, где я хотел бы видеть изменения между последними 2 датами (когда они доступны) для 3 проиндексированных столбцов (тип телефона, память и бренд). Фрейм данных выглядит следующим образом:

« » »

enter image description here

«Я хотел бы получить последнее изменение количества клиентов в каждой марке, памяти и типе телефона. Таким образом, результат будет (отсортирован по последним изменениям - когда будет доступно):

« » »

Это означает, что это изменение владений для iphone1 / 32go / apple было одним 17/10/19, и было снижение на .11 (-0.11), последнее изменение для iphone2 / 32g0 / apple было 19/03 / 19, и снижение на -.09 (-0.09), последнее изменение для iphone3 / 64g0 / apple было 05/12/16 и составило снижение на 0,12 (-0,12). Таким образом, в основном вычитание 1-го ряда вторым рядом, когда существует второй ряд (имеется в виду 2 записи, содержащие один и тот же тип телефона / память / бренд с разными датами). Если вторая строка не выходит, просто покажите 1-ю строку без изменений (первая строка [customer_holder] -0).

enter image description here

iphone4   32go        Apple        -0.50         01/11/2019

Я не знаю, как это сделать с пандами, без итераций по строкам ... Любая помощь будет очень полезна. Благодарность

Необработанные данные приведены ниже:

phonetype   memory  Brand   customers_holders   position_date
iphone1     32go    Apple   0.77                17/10/2019
iphone1     32go    Apple   0.88                10/10/2019
iphone1     32go    Apple   0.98                26/09/2019
iphone1     32go    Apple   1                   15/08/2019
iphone1     32go    Apple   0.9                 06/08/2019
iphone1     32go    Apple   0.8                 18/07/2019
iphone1     32go    Apple   0.8                 18/07/2019
iphone1     32go    Apple   0.74                20/06/2019
iphone1     32go    Apple   0.61                11/06/2019
iphone1     32go    Apple   0.5                 21/05/2019
iphone2     32go    Apple   0.5                 19/03/2019
iphone2     32go    Apple   0.59                16/01/2019
iphone2     32go    Apple   0.68                04/12/2018
iphone3     64go    Apple   0.5                 05/12/2016
iphone3     64go    Apple   0.62                11/11/2016
iphone3     64go    Apple   0.79                12/11/2018
iphone4     32go    Apple   0.50                01/11/2019

0
Je Je 21 Дек 2019 в 06:34

1 ответ

Лучший ответ

Вы можете попробовать это:

Сначала измените столбцы даты на тип datetime, чтобы найти самую последнюю дату.

df['position_date'] = pd.to_datetime(df['position_date'], format='%d/%m/%Y')
print(df.head(10))
  phonetype memory  Brand  customers_holders position_date
0   iphone1   32go  Apple               0.77    2019-10-17
1   iphone1   32go  Apple               0.88    2019-10-10
2   iphone1   32go  Apple               0.98    2019-09-26
3   iphone1   32go  Apple               1.00    2019-08-15
4   iphone1   32go  Apple               0.90    2019-08-06
5   iphone1   32go  Apple               0.80    2019-07-18
6   iphone1   32go  Apple               0.80    2019-07-18
7   iphone1   32go  Apple               0.74    2019-06-20
8   iphone1   32go  Apple               0.61    2019-06-11
9   iphone1   32go  Apple               0.50    2019-05-21

А затем
1. Отсортируйте ключевые столбцы и столбцы дат в порядке убывания.
2. Используйте функцию pd.groupby.diff, чтобы вычислить разницу с предыдущей строкой по группе. ссылка здесь!
3. Я думаю, вам нужна только разница между последней датой и предыдущей датой, поэтому используйте drop_duplicates, чтобы оставить только первую строку.
как это:


Редактировать

Затем, если diff равен nan, вы можете добавить код для заполнения значения с помощью np.where.
как это:

key_col = ['phonetype','memory','Brand']
df = df.sort_values(by= key_col + ['position_date'], ascending=False)
df['diff'] = df.groupby(key_col)['customers_holders'].diff(periods=-1)
df = df.drop_duplicates(subset=key_col, keep='first')
# if diff is nan.   
df['diff'] = np.where(df['diff'].isnull(), -df['customers_holders'], df['diff']) 
print(df)
   phonetype memory  Brand  customers_holders position_date  diff
15   iphone3   64go  Apple               0.79    2018-11-12  0.29
10   iphone2   32go  Apple               0.50    2019-03-19 -0.09
0    iphone1   32go  Apple               0.77    2019-10-17 -0.11

Чтобы он выглядел как ваш результат.

df = df.drop('customers_holders', axis=1)\
.rename({'diff':'customers_holders'},axis=1)\
.sort_values(by='phonetype')\
.reset_index(drop=True)
print(df)
  phonetype memory  Brand position_date  customers_holders
0   iphone1   32go  Apple    2019-10-17              -0.11
1   iphone2   32go  Apple    2019-03-19              -0.09
2   iphone3   64go  Apple    2018-11-12               0.29
0
yganalyst 22 Дек 2019 в 08:10