【问题标题】:Assigning a column value based on multiple column conditions in python在python中根据多列条件分配列值
【发布时间】:2016-12-23 18:15:24
【问题描述】:

我有一个这样结构的 pandas 数据框,

ID  Col1  Col2
1   50    12:23:01
1   34    12:25:11
1   65    12:32:25
1   98    12:45:08
2   23    11:09:10
2   12    11:12:43
2   56    11:13:12
2   34    11:14:26
2   77    11:16:02
3   64    14:01:11
3   34    14:01:13
3   48    14:02:32

我需要的是能够在重复的 ID 值中搜索以在第 1 列中找到条件,例如 Col1==34。基于此,我需要创建一个新列Col3,它采用Col2 中的相应值。我需要的最终结果如下所示。

ID  Col1  Col2      Col3
1   50    12:23:01  12:25:11
1   34    12:25:11  12:25:11
1   65    12:32:25  12:25:11
1   98    12:45:08  12:25:11
2   23    11:09:10  11:14:26
2   12    11:12:43  11:14:26
2   56    11:13:12  11:14:26
2   34    11:14:26  11:14:26
2   77    11:16:02  11:14:26
3   64    14:01:11  14:01:13
3   34    14:01:13  14:01:13
3   48    14:02:32  14:01:13

我尝试了以下方法,但它并没有提取独特的 Col2 值,而只是复制了 Col2

df['Col3'] = np.where(df.Col1.isin(df[df.Col2==34].Col1), df['Col2'], 0)

我意识到从 where 条件分配 df['Col2'] else 0 很可能是我的逻辑问题,并且可能有一些简单明了的方法(或者我的时间可能会花在 SQL 上),但是我不确定如何设置。提前致谢。

【问题讨论】:

    标签: python pandas numpy variable-assignment


    【解决方案1】:

    使用query + map

    df['Col3'] = df.ID.map(df.query('Col1 == 34').set_index('ID').Col2)
    
    print(df)
    
        ID  Col1      Col2      Col3
    0    1    50  12:23:01  12:25:11
    1    1    34  12:25:11  12:25:11
    2    1    65  12:32:25  12:25:11
    3    1    98  12:45:08  12:25:11
    4    2    23  11:09:10  11:14:26
    5    2    12  11:12:43  11:14:26
    6    2    56  11:13:12  11:14:26
    7    2    34  11:14:26  11:14:26
    8    2    77  11:16:02  11:14:26
    9    3    64  14:01:11  14:01:13
    10   3    34  14:01:13  14:01:13
    11   3    48  14:02:32  14:01:13
    

    处理重复项

    # keep first instance
    df.ID.map(df.query('Col1 == 34') \
        .drop_duplicates(subset=['ID']).set_index('ID').Col2)
    

    或者

    # keep last instance
    df.ID.map(df.query('Col1 == 34') \
        .drop_duplicates(subset=['ID'], keep='last').set_index('ID').Col2)
    

    【讨论】:

    • 欣赏!完美运行。
    • 实际上,这适用于测试数据集,但在我的实际数据集中,我似乎有基于错误的重复值:Reindexing only valid with uniquely valued Index objects。我假设我必须先删除重复项?
    • 那行得通。但是,你想先观察一下吗?
    • 任何观察都可以,所以采取第一个就可以了。在我的实际情况中,就好像(有时)第 1 行(Col1==34 和 Col2==12:25:11)被复制了多次,或者可能根本不被复制。直到现在我才意识到我有这些重复(我有一个相当大的数据集)
    • 感谢您对处理重复项进行编辑 - 非常有帮助。
    【解决方案2】:

    通过将id 设为索引来利用pandas 自动索引对齐。然后只需根据布尔选择附加一列。此答案假定 col1 是唯一的。

    df.set_index('id', inplace=True)
    df['col3'] = df.loc[df.col1 == 34, 'col2']
    

    【讨论】:

      【解决方案3】:

      这是一个基于 NumPy 的矢量化解决方案 -

      df['Col3'] = df.Col2.values[df.Col1.values == 34][df.ID.factorize()[0]]
      

      【讨论】:

        猜你喜欢
        • 2018-04-30
        • 1970-01-01
        • 2019-03-23
        • 2015-11-19
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多