gpt4 book ai didi

python - 如何按条件将 Pandas 数据框加入自身?

转载 作者:行者123 更新时间:2023-12-04 14:56:07 26 4
gpt4 key购买 nike

我有一个带有 2 个相关列“日期”和“值”的 python pandas 数据框,我们假设它看起来像这样并按日期排序:

data = pd.DataFrame({"date": ["2021-01-01", "2021-01-31", "2021-02-01", "2021-02-28", "2021-03-01", "2021-03-31", "2021-04-01", "2021-04-02"],
"value": [1,2,3,4,5,6,5,8]})
data["date"] = pd.to_datetime(data['date'])

现在我想以这种方式将 dataFrame 连接到自身,即我在一个月中的每个最后可用日获取值更高的下一个可用日。在我们的例子中,这基本上应该是这样的:

date, value, date2, value2:
2021-01-31, 2, 2021-02-01, 3
2021-02-28, 4, 2021-03-01, 5
2021-03-31, 6, 2021-04-02, 8
2021-04-02, 8, NaN, NaN

我目前对这个问题的部分解决方案如下所示:

last_days = data.groupby([data.date.dt.year, data.date.dt.month]).last()
res = [data.loc[(data.date>date) & (data.value > value)][:1] for date, value in zip(last_days.date, last_days.value)]
print(res)

但是因为这个答案"Don't iterate over rows in a dataframe" ,这对我来说不像是 pandas 的方式。

那么问题来了,如何用 pandas 的方式解决呢?

最佳答案

如果您没有太多行,您可以生成所有项目对并从那里进行过滤。

让我们从获取该月的最后几天开始:

>>> last = data.loc[data['date'].dt.daysinmonth == data['date'].dt.day]
>>> last
date value
1 2021-01-31 2
3 2021-02-28 4
5 2021-03-31 6

现在使用 cross join 将每个最后一天映射到任何可能的一天,然后根据较晚的日期和较大的值等条件进行过滤:

>>> pairs = pd.merge(last, data, how='cross', suffixes=('', '2'))
>>> pairs = pairs.loc[pairs['date2'].gt(pairs['date']) & pairs['value2'].gt(pairs['value'])]
>>> pairs
date value date2 value2
2 2021-01-31 2 2021-02-01 3
3 2021-01-31 2 2021-02-28 4
4 2021-01-31 2 2021-03-01 5
5 2021-01-31 2 2021-03-31 6
6 2021-01-31 2 2021-04-01 5
7 2021-01-31 2 2021-04-02 8
12 2021-02-28 4 2021-03-01 5
13 2021-02-28 4 2021-03-31 6
14 2021-02-28 4 2021-04-01 5
15 2021-02-28 4 2021-04-02 8
23 2021-03-31 6 2021-04-02 8

最后使用GroupBy.idxmin()得到第一个date2

>>> pairs.loc[pairs.groupby(['date', 'value'])['value2'].idxmin().values]
date value date2 value2
2 2021-01-31 2 2021-02-01 3
12 2021-02-28 4 2021-03-01 5
23 2021-03-31 6 2021-04-02 8

否则您可能需要apply,这与完全诚实地迭代行几乎相同。

关于python - 如何按条件将 Pandas 数据框加入自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67952424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com