【问题标题】:How to create new df based on columns of two different data frames?如何根据两个不同数据框的列创建新的df?
【发布时间】:2017-04-07 01:10:35
【问题描述】:

我正在研究以下数据帧,虽然原始数据帧非常大,有数千行,但出于说明目的,我使用了很多基本的 df。

我的第一个 df 如下:

        ID      value
    0   3       7387
    1   8       4784
    2   11      675
    3   21      900

还有一个巨大的df,比如说df2

        x            y          final_id
    0   -7.35        2.09       3
    1   -6.00        2.76       3
    2   -5.89        1.90       4
    3   -4.56        2.67       5
    4   -3.46        1.34       8
    5   -4.67        1.23       8
    6   -1.99        3.44       8
    7   -5.67        2.40       11
    8   -7.56        1.66       11
    9   -9.00        3.12       21
    10  -8.01        3.11       21 
    11  -7.90        3.19       22

现在,从第一个 df 开始,我只想考虑“ID”列并将其值与第二个数据框 (df2) 中的“final_id”列匹配。

我想创建另一个 df,它仅包含 df2 的过滤行,即仅包含“final_id”为 3、8、11、21 的行(根据 df1 的“ID”列)。

生成的df如下:

         x            y         final_id
    0   -7.35        2.09       3
    1   -6.00        2.76       3
    2   -3.46        1.34       8
    3   -4.67        1.23       8
    4   -1.99        3.44       8
    5   -5.67        2.40       11
    6   -7.56        1.66       11
    7   -9.00        3.12       21
    8   -8.01        3.11       21

我们可以看到 df2 中的第 2、3、11 行已从结果 df 中删除。

请帮忙。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用isin 创建一个掩码,然后使用布尔掩码对您的df2 进行子集化:

    mask = df2["final_id"].isin(df["ID"])
    print(df2[mask])
    
            x      y    final_id
    0   -7.35   2.09    3
    1   -6.00   2.76    3
    4   -3.46   1.34    8
    5   -4.67   1.23    8
    6   -1.99   3.44    8
    7   -5.67   2.40    11
    8   -7.56   1.66    11
    9   -9.00   3.12    21
    10  -8.01   3.11    21
    

    【讨论】:

    • 谢谢@pansen。这是我需要的。
    • 虽然不是打印,但我正在创建一个新的 df,其内容如下: mask = df2["final_df"].isin(df["ID"]) new_df = pd.DataFrame(df2[mask ]) new_df.head()
    • @Liza 可以简化为cluster5 = df2[mask]。您不需要调用数据框构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多