Как получить значение в столбце на основе условия в сводной таблице фрейма данных pandas? - PullRequest
1 голос
/ 26 марта 2019

У меня есть таблица MySQL, как показано ниже:

     ID   | article | price | promo_price | delivery_days | stock |  received_on
    17591   03D/6H   3082.00    1716.21         30            0      2019-03-20
    29315   03D/6H   3082.00    1716.21         26            0      2019-03-24
    47796   03D/6H   3082.00    1716.21         24            0      2019-03-25

    22016   L1620S    685.00    384.81           0            3      2019-03-20
    35043   L1620S    685.00    384.81           0            2      2019-03-24
    53731   L1620S    685.00    384.81           0            2      2019-03-25

Я создал сводную таблицу для мониторинга биржевых данных.

md = df.pivot_table(
        values='stock', 
        index=['article','price', 'promo_price','delivery_days'], 
        columns='received_on', 
        aggfunc=np.sum)

dates = md.columns.tolist()
dates.sort(reverse=True)

md = md[dates]

Это результат

    +---------------------------------+--------------+--------------+--------------+
    |                                 |   2019-03-25 |   2019-03-24 |   2019-03-20 |
    |---------------------------------+--------------+--------------+--------------|
    | ('03D/6H', 3082.0, 1716.21, 24) |            0 |          nan |          nan |
    | ('03D/6H', 3082.0, 1716.21, 26) |          nan |            0 |          nan |
    | ('03D/6H', 3082.0, 1716.21, 30) |          nan |          nan |            0 |
    | ('L1620S-KD', 685.0, 384.81, 0) |            2 |            2 |            3 |
    +---------------------------------+--------------+--------------+--------------+

Как мне отфильтровать строки и получить цену, промо-цену и дни доставки товара на основе даты последнего поступления товара?

Например: я хочу получить информацию об акциях за все дни, кроме цены, promo_price и дни доставки только 2019-03-25, как показано нижеЯ получаю результат, как и ожидалось.Но если в значениях есть какие-либо изменения, я получаю несколько строк для одной и той же статьи.

Article L1620S данные ожидаемые.Но статья 03D / 6H вылилась в три строки.

1 Ответ

1 голос
/ 26 марта 2019

Вы можете использовать:

df['received_on'] = pd.to_datetime(df['received_on'])

md = df.pivot_table(
        values='stock', 
        index=['article','price', 'promo_price','delivery_days'], 
        columns='received_on', 
        aggfunc=np.sum)

#sorting columns in descending order
md = md.sort_index(axis=1, ascending=False)

#remove missing rows in first column
md = md.dropna(subset=[md.columns[0]])
#another solution 
#md = md[md.iloc[:, 0].notna()]
print (md)
received_on                               2019-03-25  2019-03-24  2019-03-20
article price  promo_price delivery_days                                    
03D/6H  3082.0 1716.21     24                    0.0         NaN         NaN
L1620S  685.0  384.81      0                     2.0         2.0         3.0

РЕДАКТИРОВАТЬ: сначала фильтр по первому уровню, а затем по положению - первый ряд:

md = md.sort_index(axis=1, ascending=False)

idx = pd.IndexSlice
md1 = md.loc[idx['03D/6H',:,:],:].iloc[[0]]
print (md1)
received_on                               2019-03-25  2019-03-24  2019-03-20
article price  promo_price delivery_days                                    
03D/6H  3082.0 1716.21     24                    0.0         NaN         NaN
...