问题描述
我在此链接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