根据是否在字典中找到每行中的两列值来过滤 python DataFrame

问题描述 投票:0回答:1

我有一个包含主题 ID 和项目 ID 的 df。一个项目 ID 对于一个主题 ID 可能出现多次,并且多个项目 ID 可以分配给一个主题 ID。

  subid itemid
0 0001  1111
1 0001  1112
2 0001  1113
3 0001  1113
4 0002  1114
5 0002  1114

我还有一个字典,其中每个键都是一个主题 ID,每个值都是已分配给该主题的所有项目 ID。

dict = {(0001: '1111', '1112'), (0002: '1114')}

我想迭代 df 的每一行并检查 a) 是否在字典中找到 subid,b) 如果是,则 itemid 是否分配给字典中的该 subid。如果任一问题的答案是否定的,我想从 df 中删除该行。在上面的示例中,我希望删除第 2 行和第 3 行,因为 0001: '1113' 没有出现在字典中。

我知道我在这方面还差得很远。我首先尝试使用 df.iterrows() 或 df.index 创建一个 for 循环。我不知道这是否是正确的方法,或者下一步该去哪里。我收到以下代码的“unhasable type: 'Series'”错误。如有任何帮助,我们将不胜感激。

for index, row in df.iterrows():
    if df['subid'] in dict:
        if df['itemid'] in dict:
            continue
        else:
            df.drop(index, inplace=True)
    else:
        df.drop(index, inplace=True)
python dataframe dictionary filtering
1个回答
0
投票

iterrows 对于刚接触 pandas 的人来说很诱人,但大多数时候,它都是垃圾。为了在 pandas 中生存,你只需要做两件事:df.loc 和 df.apply。一切都可以用他们来做。当然,Pandas 提供了更多功能,但您始终可以回退到 df.loc/df.apply。

import pandas as pd


data = {
    "subid": ["0001", "0001", "0001", "0001", "0002", "0002"],
    "itemid": ["1111", "1112", "1113", "1113", "1114", "1114"],
}
df = pd.DataFrame(data)
d = {"0001": ("1111", "1112"), "0002": ("1114",)}

df["mapped"] = df.subid.map(d)
dfresults = df.loc[df.apply(lambda x: x.itemid in x.mapped, axis=1)].drop(
    columns=["mapped"]
)
print(dfresults)
   subid itemid
0  0001   1111
1  0001   1112
4  0002   1114
5  0002   1114
© www.soinside.com 2019 - 2024. All rights reserved.