gpt4 book ai didi

python - 使用 MultiIndex 过滤

转载 作者:太空狗 更新时间:2023-10-29 22:20:49 24 4
gpt4 key购买 nike

我有一个像这样的 Pandas DataFrame:

import numpy as np
import pandas as pd

np.random.seed(1234)
midx = pd.MultiIndex.from_product([['a', 'b', 'c'], pd.date_range('20130101', periods=6)], names=['letter', 'date'])
df = pd.DataFrame(np.random.randn(len(midx), 1), index=midx)

那个数据框看起来像这样:

                        0
letter date
a 2013-01-01 0.471435
2013-01-02 -1.190976
2013-01-03 1.432707
2013-01-04 -0.312652
2013-01-05 -0.720589
2013-01-06 0.887163
b 2013-01-01 0.859588
2013-01-02 -0.636524
2013-01-03 0.015696
2013-01-04 -2.242685
2013-01-05 1.150036
2013-01-06 0.991946
c 2013-01-01 0.953324
2013-01-02 -2.021255
2013-01-03 -0.334077
2013-01-04 0.002118
2013-01-05 0.405453
2013-01-06 0.289092

我想做的是根据 date 的条件保留所有行,这取决于 letter。例如,

  • 对于字母a,我想保留所有行,这样日期在“20130102”和“20130105”(包括在内)之间
  • 对于字母 b,我想保留所有行,这样 date == "20130103"
  • 对于字母c,我想保留所有行,这样日期在“20130103”和“20130105”(包括在内)之间

例如,所有这些信息都可以存储在字典中。

dictionary = {"a": slice("20130102", "20130105"),
"b": "20130103",
"c": slice("20130103", "20130105")}

有没有一种简单的方法可以用 pandas 计算这个?我没有找到有关此类过滤的任何信息。

最佳答案

您可以使用query,它就是为这种选择标准而设计的。

如果您稍微修改您的字典,您可以在列表理解的帮助下生成您想要的查询:

In : dictionary
Out:
{'a': ('20130102', '20130105'),
'b': ('20130103', '20130103'),
'c': ('20130103', '20130105')}

In : df.query(
' or '.join("('{}' <= date <= '{}' and letter == '{}')".format(*(v + (k,)))
for k, v in dictionary.items())
)
Out:
0
letter date
a 2013-01-02 -1.190976
2013-01-03 1.432707
2013-01-04 -0.312652
2013-01-05 -0.720589
b 2013-01-03 0.015696
c 2013-01-03 -0.334077
2013-01-04 0.002118
2013-01-05 0.405453

有关查询语句实际执行的操作的更多信息,请参阅列表理解的详细信息:

In : (' or '.join("('{}' <= date <= '{}' and letter == '{}')".format(*(v + (k,)))
for k, v in dictionary.items()))
Out: "('20130102' <= date <= '20130105' and letter == 'a') or
('20130103' <= date <= '20130105' and letter == 'c') or
('20130103' <= date <= '20130103' and letter == 'b')"

关于python - 使用 MultiIndex 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49237656/

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