【问题标题】:Fill duplicates with missing value after grouping with some logic用一些逻辑分组后用缺失值填充重复项
【发布时间】:2023-01-28 11:59:57
【问题描述】:

我有一个数据框,如果 owner_type 相同,我需要删除 ticket_id 的重复项,如果不同,则选择 'm' 而不是 's',如果没有值被选中,则返回 NaN:

data = pd.DataFrame({'owner_type':['m','m','m','s','s','m','s','s'],'ticket_id':[1,1,2,2,3,3,4,4]})

'|    | owner_type   |   ticket_id |
 |---:|:-------------|------------:|
 |  0 | m            |           1 |
 |  1 | m            |           1 |
 |  2 | m            |           2 |
 |  3 | s            |           2 |
 |  4 | s            |           3 |
 |  5 | m            |           3 |
 |  6 | s            |           4 |
 |  7 | s            |           4 |'

应该回馈:

'|    | owner_type   |   ticket_id |
 |---:|:-------------|------------:|
 |  0 | m            |         NaN |
 |  1 | m            |         NaN |
 |  2 | m            |           2 |
 |  3 | s            |         NaN |
 |  4 | s            |         NaN |
 |  5 | m            |           3 |
 |  6 | s            |         NaN |
 |  7 | s            |         NaN |'

伪代码如下:如果 ticket_id 重复,则查看 owner_type,如果 owner_type 有一个以上的值,则返回“m”的值和“s”的 NaN。

我的尝试

data.groupby('ticket_id').apply(lambda x: x['owner_type'] if len(x) < 2 else NaN)

不工作

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    尝试这个:

    (df['ticket_id'].where(
        ~df.duplicated(['owner_type','ticket_id'],keep=False) & 
        df['owner_type'].eq(df.groupby('ticket_id')['owner_type'].transform('min'))))
    

    旧答案:

    m = ~df.duplicated(keep=False) & df['owner_type'].eq('m')
    df['ticket_id'].where(m)
    

    输出:

    0    NaN
    1    NaN
    2    2.0
    3    NaN
    4    NaN
    5    3.0
    6    NaN
    7    NaN
    

    【讨论】:

    • 只有一个问题,如果我有更多列怎么办?我试图简化我的示例,但是当我尝试执行 df.duplicated(keep=False) 时,我无法指定列。想象一下,除了 owner_type 和 ticket_id 之外,我还有更多不重复的列,还有选择吗?
    • 您可以在duplicated() 中指定列。 df.duplicated(subset = ['col1','col2'...],keep=False) pandas.pydata.org/docs/reference/api/…
    • 还有一个问题,如果没有重复的行并且 owner_type 是 s,则共享的逻辑将不起作用,您能帮我解决我必须更改的内容吗? @rhug123
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多