Pandas 如何根据数据帧透视表中的条件获取列中的值?

Pandas 如何根据数据帧透视表中的条件获取列中的值?,pandas,pivot-table,python-3.6,Pandas,Pivot Table,Python 3.6,我有一个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 201

我有一个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 |
    +---------------------------------+--------------+--------------+--------------+
如何根据最近的收货日期筛选行并获取商品的价格、促销价格和交货日期

例如:我想要所有日期的股票信息,但价格、促销价格和交付日期仅为2019-03-25,如下所示

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

如果价格、促销价格和交货期没有变化,我会得到预期的结果。但是,如果值有任何变化,那么我将为同一篇文章获得多行

文章1620年代的数据与预期一致。但是文章03D/6H产生了三行。

您可以使用:

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

您能否解释更多
如何根据最近的收货日期筛选行并获取商品的价格、促销价格和交货日期?例如:我想要所有日期的股票信息,但价格、促销价格和交付日期仅为2019-03-25,如下所示
?为什么选择第一行?因为如果要选择带有日期的列,它是
md['2019-03-25']
。谢谢。你怎么只得到最近的日期值(价格促销?价格交付?天数)?@Abhilash-你能解释更多吗?对于文章03D/6H,你怎么只得到一行?明白了。谢谢你,耶兹雷尔。谢谢你的快速回复。非常感谢。无论如何,我正在使用ExcelWriter将这些数据写入Excel。因此,我设法使用ExcelWriter(r'filepath',datetime_format='yyyy-dd-MM')修改了日期格式。我感谢你的帮助。