繁体   English   中英

python - 如何使用python中另一个数据框中的列中的重复值为唯一行对数据框进行子集化?

[英]How can I subset a data frame for unique rows using repeating values from a column in another data frame in python?

我有 2 个数据框。 我想根据 df_2 对 df_1 进行子集化,以便结果数据框中的行对应于 df_2 中的行。 以下是两个示例数据框:

df_1 = pd.DataFrame({
    "ID": ["Lemon","Banana","Apple","Cherry","Tomato","Blueberry","Avocado","Lime"], 
    "Color": ["Yellow","Yellow","Red","Red","Red","Blue","Green","Green"]})

df_2 = pd.DataFrame({"Color": ["Red","Blue","Yellow","Green","Red","Yellow"]})

我想要的输出是 df_3,其中“颜色”列与 df_2 中的相同:

df_3 = pd.DataFrame({
    "ID": ["Apple","Blueberry","Lemon","Avocado","Cherry","Banana"], 
    "Color": ["Red","Blue","Yellow","Green","Red","Yellow"]})

当我合并 df_1 和 df_2 时,我得到重复的行,因为 df_2 中的大多数行在 df_1 中有多个匹配项。

merged = df_2.merge(df_1, how="left", on="Color")

删除重复项适用于“黄色”颜色,因为它在 df_2 中的值和 df_1 中的选项的比率为 2:2,但对于“红色”或“绿色”则不能正常工作,因为它们的比率为 2:3和 1:2 的比例,导致额外的行。

no_duplicates = merged.drop_duplicates(subset = "ID")

有没有办法对 df_1 进行子集化,其中 df_2 中第一次出现“Red”会提取 df_1 中第一次出现的“Red”,df_2 中第二次出现的“Red”会提取 df_1 中第二次出现的“Red”,等等。? 除非别无选择,否则我宁愿不使用循环。 谢谢你。

尝试添加的指标列都df_1df_2groupby cumcount获得位置,以及:

df_1['i'] = df_1.groupby('Color').cumcount()
df_2['i'] = df_2.groupby('Color').cumcount()

df_1

          ID   Color  i
0      Lemon  Yellow  0
1     Banana  Yellow  1
2      Apple     Red  0
3     Cherry     Red  1
4     Tomato     Red  2
5  Blueberry    Blue  0
6    Avocado   Green  0
7       Lime   Green  1

df_2

    Color  i
0     Red  0
1    Blue  0
2  Yellow  0
3   Green  0
4     Red  1
5  Yellow  1

然后merge指标和Color然后drop指标列:

merged_df = df_1.merge(df_2, how='right', on=['Color', 'i']).drop('i', axis=1)

merged_df

          ID   Color
0      Apple     Red
1  Blueberry    Blue
2      Lemon  Yellow
3    Avocado   Green
4     Cherry     Red
5     Banana  Yellow

或者 create pass 系列直接merge (这使df_1df_2不受影响):

merged_df = df_1.merge(
    df_2, how='right',
    left_on=['Color', df_1.groupby('Color').cumcount()],
    right_on=['Color', df_2.groupby('Color').cumcount()]
).drop('key_1', axis=1)

merged_df

          ID   Color
0      Apple     Red
1  Blueberry    Blue
2      Lemon  Yellow
3    Avocado   Green
4     Cherry     Red
5     Banana  Yellow

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM