【问题标题】:Python 3.4 - Pandas - Extract Rows Based on Column of another Dataframe Including DuplicatesPython 3.4 - Pandas - 基于另一个数据框的列提取行,​​包括重复项
【发布时间】:2018-08-11 15:09:37
【问题描述】:

我有两个输入数据帧,格式为:

Word    colA colB colC ID
python   A     B    C   1
word     D     E    F   1
of       G     H    I   1
python   J     K    L   2
is       M     N    O   2
of       P     Q    R   3

另一种格式为:

V1       V2    V3   V4
the     0.1   0.2  0.3
python  0.4   0.5  0.6
excel   0.6   0.7  0.8
is      0.9   0.10 0.6
access  0.7   0.5  0.6
of      0.5   1.2  7.8
tell    0.9   3.2  4.5
pandas  0.5   0.4  0.3

让我们调用第一个数据帧 df1 和第二个数据帧 df2。

我想知道如何根据 V1 对具有与 df1['Word'] 相同术语的 df2 进行子集化。如果 V1 中的术语在 df1['Word'] 中没有匹配项,我希望行用零填充。另外,另一个关键点是我想包含重复项。我还想将“ID”列复制到 df2 数据框。

我的预期输出将采用以下格式:

   V1    V2    V3   V4  ID
python  0.4   0.5  0.6  1
word    0.0   0.0  0.0  1
of      0.5   1.2  7.8  1
python  0.4   0.5  0.6  2
is      0.9   0.10 0.6  2
of      0.5   1.2  7.8  3

我能够成功识别输出数据框中的术语并对其进行子集化,而不会显示重复项。但是包括重复的术语对我来说有点挑战。我还需要帮助才能成功地将 df1['ID'] 列复制到输出数据帧的末尾。

如果能得到任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    用途:

    • 首先重命名列Word 并按子集[[]] 仅选择必要的列
    • merge 左连接
    • 将所有NaNs 替换为fillna
    • 如果列的顺序很重要,则最后一个reindex

    df = (pd.merge(df1.rename(columns={'Word':'V1'})[['V1', 'ID']], 
                   df2, on='V1', how='left')
            .fillna(0)
            .reindex(columns=['V1','V2','V3','V4','ID']))
    print (df)
           V1   V2   V3   V4  ID
    0  python  0.4  0.5  0.6   1
    1    word  0.0  0.0  0.0   1
    2      of  0.5  1.2  7.8   1
    3  python  0.4  0.5  0.6   2
    4      is  0.9  0.1  0.6   2
    5      of  0.5  1.2  7.8   3
    

    【讨论】:

    • 谢谢,我试试看。在我做之前的一个快速问题,有没有办法从数据框中自动删除“Word”、“colA -colC”中的列?或者我需要在创建结果数据框后手动删除它们吗?
    • 我已经注意到您的更改,我会尝试一下。谢谢
    • @VinayAshokkumar - 好问题,最后只需要列 V1ID,所以没有必要删除它们。
    • 这似乎可行,但我需要将其扩展到更大的数据集。假设我有 50 列从 V1 到 V50。在 .reindex() 部分的声明中,有没有办法选择一系列列变量?类似于 V1-V50 的东西?还是我必须列出'V1'、'V2、.....、V50 中的每一列,这可能非常乏味。谢谢。
    • 不,使用列表理解c = ['V{}'.format(x) for x in range(1, 51)]
    猜你喜欢
    • 2017-01-21
    • 2020-04-26
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多