求助:筛选同时满足组织与国家Top2频次的Pandas数据
Pandas筛选同时属于Top2国家和Top2组织的data_fingerprint
问题说明
给定以下DataFrame:
country data_fingerprint organization US 111 Tesco UK 222 IBM US 111 Yahoo PY 333 Tesco US 111 Boeing CN 333 TCS NE 458 Yahoo UK 678 Tesco
需要筛选出同时属于出现次数Top2的组织和出现次数Top2的国家对应的data_fingerprint。其中组织Top2为Tesco、Yahoo,国家Top2为US、UK,期望输出:
data_fingerprint 111 678
用户尝试的代码未得到有效数据:
# First find top 2 occurances of organization nd = df['organization'].value_counts().groupby(level=0, group_keys=False).head(2) # Then checking if the organization exist in the complete dataframe and filtering those rows new = df["organization"].isin(nd)
错误原因
df['organization'].value_counts()返回的是索引为组织名称、值为出现次数的Series。使用head(2)后,nd的内容是Top2组织的次数(如Tesco:3、Yahoo:2),而isin(nd)是判断组织名称是否等于这些次数值,自然匹配不到任何数据。正确的做法是取nd的索引(即组织名称)来做匹配。
正确实现代码
import pandas as pd # 构造示例DataFrame data = { 'country': ['US', 'UK', 'US', 'PY', 'US', 'CN', 'NE', 'UK'], 'data_fingerprint': [111, 222, 111, 333, 111, 333, 458, 678], 'organization': ['Tesco', 'IBM', 'Yahoo', 'Tesco', 'Boeing', 'TCS', 'Yahoo', 'Tesco'] } df = pd.DataFrame(data) # 获取出现次数Top2的国家列表 top2_countries = df['country'].value_counts().head(2).index.tolist() # 获取出现次数Top2的组织列表 top2_organizations = df['organization'].value_counts().head(2).index.tolist() # 筛选同时满足国家和组织条件的行 filtered_rows = df[(df['country'].isin(top2_countries)) & (df['organization'].isin(top2_organizations))] # 提取目标字段并去重(匹配期望输出格式) result = filtered_rows['data_fingerprint'].drop_duplicates().reset_index(drop=True) print(result)
代码说明
- 获取Top2列表:
value_counts()统计频次,head(2)取前两名,.index提取对应的国家/组织名称,转成列表用于后续筛选。 - 布尔索引筛选:用
&连接两个条件,同时匹配Top2国家和Top2组织。 - 去重处理:原始数据中同一
data_fingerprint可能对应多个符合条件的行,用drop_duplicates()去重后得到期望结果。
输出结果:
0 111 1 678 Name: data_fingerprint, dtype: int64
内容的提问来源于stack exchange,提问作者pythonNinja
相关产品推荐
相关产品推荐

