我有一个包含主题 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)
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