【问题标题】:Select rows in a pandas DataFrame that match the first two different items of one column在 pandas DataFrame 中选择与一列的前两个不同项匹配的行
【发布时间】:2021-02-22 07:43:56
【问题描述】:

我想显示 DataFrame 中 'Nameid' 列下的值对应于在该列中找到的前两个不同值的所有行。

在下面的示例中,名为'Nameid' 的列下的前两个不同值是12。我想选择'Nameid' 等于12 的所有行,并丢弃其余行。我该怎么做?

我有什么:

import pandas as pd

df = pd.DataFrame(data={
    'Nameid': [1, 2, 3, 1],
    'Name': ['Michael', 'Max', 'Susan', 'Michael'],
    'Project': ['S455', 'G874', 'B7445', 'Z874'],
})
display(df.head(10))

我想要什么:

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    首先按Nameid 列按DataFrame.sort_values 排序:

    df = df.sort_values('Nameid')
    

    然后使用Series.isinSeries.unique 的两个第一个唯一值:

    df1 = df[df['Nameid'].isin(df['Nameid'].unique()[:2])].reset_index(drop=True)
    print (df1)
       Nameid     Name Project
    0       1  Michael    S455
    1       1  Michael    Z874
    2       2      Max    G874
    

    替代Series.drop_duplicates:

    df1 = df[df['Nameid'].isin(df['Nameid'].drop_duplicates()[:2])].reset_index(drop=True)
    

    编辑:如果想过滤等于或小于2,谢谢@DarrylG:

    df2 = df[df['Nameid'] <= 2].reset_index(drop=True)
    

    【讨论】:

    • @jezrael--我可能误解了这个问题,但并不是“..所有大于两个的 Nameids 都被消除”意味着保持 ID
    • @jezrael——在这种情况下,解决方案似乎只是:df[df['Nameid'] &lt;= 2].reset_index(drop=True)
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2019-09-07
    • 2014-06-21
    • 2016-05-01
    • 2021-04-22
    相关资源
    最近更新 更多