gpt4 book ai didi

python - Pandas - 在包含间隔的 MultiIndex 上建立索引

转载 作者:行者123 更新时间:2023-12-04 01:28:53 25 4
gpt4 key购买 nike

我有一个 pandas 数据框 df1,它的 MultiIndex 由 user_id 值和一个 start_dateend_date IntervalIndex 组成.我想根据第二个数据帧 df2 中的相应值从 df1 中选择行。

数据帧 df1df2 如下所示:

In [1]: df1
Out [1]:
start_date end_date status score
user_id
A [2017-03-07, 2017-03-11] 2017-03-07 2017-03-11 S1 1000
[2017-03-12, 2017-04-03] 2017-03-12 2017-04-03 S2 1000
[2017-04-04, 2017-05-21] 2017-04-04 2017-05-21 S1 1000
[2017-05-22, 2222-12-31] 2017-05-22 2222-12-31 S3 1000
B [2018-12-01, 2018-12-22] 2018-12-01 2018-12-22 S1 900
[2018-12-23, 2018-12-28] 2018-12-23 2018-12-28 S2 900
[2018-12-29, 2222-12-31] 2018-12-29 2222-12-31 S1 1500


In [2]: df2
Out [2]:
user_id ref_date
0 A 2017-04-24
1 B 2018-12-25

我有兴趣从 df1 中选择也在 df2df1 区间中的 user_id相应的 df2.ref_date 所在的位置。在此示例中,我希望获得第三行和第六行。

如果我使用 df2 的单行,我可以通过运行以下命令在 df1 中找到相应的行:

In [3]: df1.loc[['A']].index.get_level_values(1).get_indexer([pd.to_datetime('2017-04-24')])
Out [3]: array([2])

有没有办法用数组一次性做索引?

这里是创建数据框的代码:

users = {'user_id': ['A','A','A','A', 'B','B','B'],
'start_date': ['2017-03-07', '2017-03-12', '2017-04-04', '2017-05-22', '2018-12-01', '2018-12-23', '2018-12-29'],
'end_date': ['2017-03-11', '2017-04-03', '2017-05-21', '2222-12-31', '2018-12-22', '2018-12-28', '2222-12-31'],
'status': ['S1', 'S2', 'S1', 'S3', 'S1', 'S2', 'S1'],
'score': [1000, 1000, 1000, 1000, 900, 900, 1500]
}

df1 = pd.DataFrame(users, columns = ['user_id', 'start_date', 'end_date', 'status', 'score'])

for col in ['start_date', 'end_date']:
df1[col] = pd.to_datetime(df1[col])

df1.set_index(['user_id', pd.IntervalIndex.from_arrays(df1['start_date'], df1['end_date'], closed='both')], drop=True, inplace=True)



df2 = pd.DataFrame({'user_id': ['A', 'B'],
'ref_date': ['2017-04-24', '2018-12-25']})

df2['ref_date'] = pd.to_datetime(df2['ref_date'])

最佳答案

一种解决方案是合并两个数据框,然后进行查询:

df1.index.names = ['user_id', 'date_ranges']

df_merged = df1.merge(df2, on='user_id', how='left').\
query('start_date <= ref_date <= end_date')

df_merged.head()

# user_id start_date end_date status score ref_date
# 2 A 2017-04-04 2017-05-21 S1 1000 2017-04-24
# 5 B 2018-12-23 2018-12-28 S2 900 2018-12-25

缺点是合并后的dataframe会丢失multindex。但是,如果在 merge 中保留 how='left,则可以在 df1 中使用 df_merged 的整数索引> 使用 iloc:

df1.iloc[df_merged.index].head()

# user_id start_date end_date status score
# A [2017-04-04, 2017-05-21] 2017-04-04 2017-05-21 S1 1000
# B [2018-12-23, 2018-12-28] 2018-12-23 2018-12-28 S2 900

关于python - Pandas - 在包含间隔的 MultiIndex 上建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61376742/

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