基于多个条件的Python数据透视表

问题描述

我在此链接SUMIFS in python jupyter中问了一个问题

但是,我只是意识到该解决方案不起作用,因为它们可以在不同的日期打开和关闭。因此,基本上,他们必须先退出,然后才能进入。

以下是数据框(根据日期排序):

+---------------+--------+---------+-----------+--------+
| Switch In/Out | Client | Quality |   Date    | Amount |
+---------------+--------+---------+-----------+--------+
| Out           |      1 | B       | 15-Aug-19 |    360 |
| In            |      1 | A       | 16-Aug-19 |    180 |
| In            |      1 | B       | 17-Aug-19 |    180 |
| Out           |      1 | A       | 18-Aug-19 |    140 |
| In            |      1 | B       | 18-Aug-19 |     80 |
| In            |      1 | A       | 19-Aug-19 |     60 |
| Out           |      2 | B       | 14-Aug-19 |     45 |
| Out           |      2 | C       | 15-Aug-20 |     85 |
| In            |      2 | C       | 15-Aug-20 |    130 |
| Out           |      2 | A       | 20-Aug-19 |    100 |
| In            |      2 | A       | 22-Aug-19 |     30 |
| In            |      2 | B       | 23-Aug-19 |     30 |
| In            |      2 | C       | 23-Aug-19 |     40 |
+---------------+--------+---------+-----------+--------+

然后我将创建一个新列,并将其分为不同的交易。


+---------------+--------+---------+-----------+--------+------+
| Switch In/Out | Client | Quality |   Date    | Amount | Rows |
+---------------+--------+---------+-----------+--------+------+
| Out           |      1 | B       | 15-Aug-19 |    360 |    1 |
| In            |      1 | A       | 16-Aug-19 |    180 |    1 |
| In            |      1 | B       | 17-Aug-19 |    180 |    1 |
| Out           |      1 | A       | 18-Aug-19 |    140 |    2 |
| In            |      1 | B       | 18-Aug-19 |     80 |    2 |
| In            |      1 | A       | 19-Aug-19 |     60 |    2 |
| Out           |      2 | B       | 14-Aug-19 |     45 |    3 |
| Out           |      2 | C       | 15-Aug-20 |     85 |    3 |
| In            |      2 | C       | 15-Aug-20 |    130 |    3 |
| Out           |      2 | A       | 20-Aug-19 |    100 |    4 |
| In            |      2 | A       | 22-Aug-19 |     30 |    4 |
| In            |      2 | B       | 23-Aug-19 |     30 |    4 |
| In            |      2 | C       | 23-Aug-19 |     40 |    4 |
+---------------+--------+---------+-----------+--------+------+

有了这个,我可以套用枢轴公式,然后从中取值。 但是,如何在python中执行此操作?在excel中,我可以使用多个SUMIFS进行比较。但是,这在python中是不可能的。

谢谢!

解决方法

一种简单的解决方案是对作为新列结果的每个元素进行迭代并对其应用校验(函数),因此:map。

使用|-----------|-----------|-----------| | Col A | Col B | Col C | |-----------|-----------|-----------| | 1 | apple | | |-----------|-----------|-----------| | 2 | apple | 1 | |-----------|-----------|-----------| | 3 | pear | | |-----------|-----------|-----------| | 4 | pear | 3 | |-----------|-----------|-----------| | 5 | pear | 3 | |-----------|-----------|-----------| | 6 | lime | | |-----------|-----------|-----------| | 7 | orange | | |-----------|-----------|-----------| | 8 | orange | 7 | |-----------|-----------|-----------| ,我们获取要作为参数传递的每个项目的索引,因此我们可以使用值进行获取,比较。在您的情况下,您的目标是确定对“ Out”的更改并保持计数器状态。

df.index.map

结果:

import pandas as pd
switchInOut = ["Out","In","Out","In"]
df = pd.DataFrame(switchInOut,columns=['Switch In/Out'])
counter = 1

def changeToOut(i):
    global counter
    if df["Switch In/Out"].get(i) == "Out" and df["Switch In/Out"].get(i-1) == "In":
        counter += 1
    return counter

rows = df.index.map(changeToOut)
df["Rows"] = rows
df

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...