【问题标题】:Select rows of pandas dataframe in order of a given list with repetitions and keep the original index按给定列表的顺序选择重复的熊猫数据框行并保留原始索引
【发布时间】:2020-11-20 00:30:09
【问题描述】:

查看herehere 并在文档中,我仍然找不到根据所有这些标准从DataFrame 中选择行的方法:

  • 按照给定列的值列表中给定的顺序返回行
  • 返回重复的行(与列表中的重复值相关联)
  • 保留原始索引
  • 忽略 DataFrame 中不存在的列表值

举个例子,让

df = pd.DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]})
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

list_of_values = [3, 4, 6, 4, 3, 8]

那我想得到如下DataFrame:

     A   B
2    3   3
3    4   5
1    6   2
3    4   5
2    3   3

我怎样才能做到这一点? Zero's answer 看起来很有希望,因为它是我发现的唯一一个保留原始索引的,但它不适用于重复。关于如何修改/概括它的任何想法?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种使用 merge 的方法:

    list_df = pd.DataFrame({"A": list_of_values, "order": range(len(list_of_values))})
    
    pd.merge(list_df, df, on="A").sort_values("order").drop("order", axis=1)
    

    输出是:

       A  B
    0  3  3
    2  4  5
    4  6  2
    3  4  5
    1  3  3
    

    【讨论】:

    • 我对列有缩进问题,但查看 A 和 B - 似乎与您要查找的内容相同。
    • 问题不在列,而在索引。
    【解决方案2】:

    我们必须先将index 分配为列来保留它,这样我们才能在mering 之后set_index

    list_of_values = [3, 4, 6, 4, 3, 8]
    df2 = pd.DataFrame({'A': list_of_values, 'order': range(len(list_of_values))})
    
    dfn = (
        df.assign(idx=df.index)
        .merge(df2, on='A')
        .sort_values('order')
        .set_index('idx')
        .drop('order', axis=1)
    )
    

         A  B
    idx      
    2    3  3
    3    4  5
    1    6  2
    3    4  5
    2    3  3
    

    如果你想去掉索引名(idx),使用rename_axis

    dfn = dfn.rename_axis(None)
    
       A  B
    2  3  3
    3  4  5
    1  6  2
    3  4  5
    2  3  3
    

    【讨论】:

    • 谢谢,这确实有效。至于重命名索引,我想dfn.index = dfn.index.rename("") 也可以,但肯定更冗长。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2021-09-02
    • 2014-10-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多