【问题标题】:Pandas Groupby at least 1 of 2 columns matchPandas Groupby 2 列中的至少 1 列匹配
【发布时间】:2020-06-09 15:23:04
【问题描述】:

我有一个 pandas df,其中有一列用于 Names,两列用于 2 个可能的出生年份。如果至少有一个出生年份列匹配,我想按姓名和出生年份分组。

FullName     BirthYr1  BirthYr2
Smith, Joe   1985      1986
Dolan, Tom   1991      1992
Smith, Alex  1984      1985
Smith, Joe   1984      1985
Dolan, Tom   1991      1992
Smith, Alex  1986      1987

BirthYr2 总是比 BirthYr1 多 1。

2 'Smith, Joe' 将被分组,因为他们都有 1985 年(1 场比赛),2 'Dolan, Tom' 将被分组,因为两列相同(2 场比赛),而 2 ' Smith, Alex' 将不会被分组,因为他们没有任何匹配项。

一旦我弄清楚这一点,我计划使用 ngroup() 为每个组分配一个唯一的 ID。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这感觉过于复杂,但我认为它可以实现您的目标。假设您的起始 DataFrame 名为 df:

    # "Melt" the birth year columns such that each value is given its own
    # row. Throw away the redundant column names BirthYr1 and BirthYr2, 
    # since their values are equally important to us.
    
    melted = df.melt(id_vars='FullName', value_name='BirthYr').drop(columns='variable')                                                               
    melted
           FullName  BirthYr
    0    Smith, Joe     1985
    1    Dolan, Tom     1991
    2   Smith, Alex     1984
    3    Smith, Joe     1984
    4    Dolan, Tom     1991
    5   Smith, Alex     1986
    6    Smith, Joe     1986
    7    Dolan, Tom     1992
    8   Smith, Alex     1985
    9    Smith, Joe     1985
    10   Dolan, Tom     1992
    11  Smith, Alex     1987
    
    
    # Group by fullname, then birth year.
    
    grouped = melted.groupby(['FullName', 'BirthYr']).size() 
    grouped
    FullName     BirthYr
    Dolan, Tom   1991       2
                 1992       2
    Smith, Alex  1984       1
                 1985       1
                 1986       1
                 1987       1
    Smith, Joe   1984       1
                 1985       2
                 1986       1
    dtype: int64
    
    
    # Any group with more than one member represents a match.
    
    grouped[grouped > 1].reset_index()['FullName'].unique()                                                                     
    array(['Dolan, Tom', 'Smith, Joe'], dtype=object)
    

    【讨论】:

    • 这给了我一些很好的起点,但我仍然需要一个组来处理所有事情,Smith, Alex 只有 2 个组。
    • 你的预期输出是什么?
    猜你喜欢
    • 2019-03-11
    • 2018-12-07
    • 2019-12-12
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多