【发布时间】:2018-12-06 06:52:14
【问题描述】:
我有一个带有 product_id 及其 property_id 的巨大数据框。请注意,每个属性都以新索引开头。我需要同时过滤每个product_id 的不同property_id 值。有什么办法可以快速做到吗?
out_df
product_id property_id
0 3588 1
1 3588 2
2 3588 5
3 3589 1
4 3589 3
5 3589 5
6 3590 1
7 3590 2
8 3590 5
例如,希望通过分配在不同行(如 out_df.loc[(out_df['property_id'] == 1) & (out_df['property_id'] == 2)] 但不是它)的两个属性来过滤每个 product_id)。
我需要类似的东西,但同时为每个 product_id 列的所有行工作。
我知道可以通过groupby 进入列表
3587 [2, 1, 5]
3588 [1, 3, 5]
3590 [1, 2, 5]
并在列表中查找交叉点。
gp_df.apply(lambda r: {1, 2} < (set(r['property_id'])), axis=1)
但这需要时间,同时 Pandas 的通用过滤在速度上得到了极大的优化(相信在 ElasticSearch、Sphinx 等搜索引擎中使用一些棘手的右索引和逆索引)。
预期输出:{1 和 2} 都有。
3587 [2, 1, 5]
3590 [1, 2, 5]
【问题讨论】:
-
预期输出是什么?
-
预期输出是列表?还是像我的回答一样的 DataFrame?
标签: python-3.x performance pandas pandas-groupby