根据条件将列值转换为列表的列

时间:2019-01-31 23:44:34

标签: python python-3.x pandas group-by pandas-groupby

数据集为:

var result = deepSearch(myObject, 'title', (k, v) => v === 'Some Recommends');

我想按 id col2 col3 0 1 1 123 1 1 1 234 2 1 0 345 3 2 1 456 4 2 0 1243 5 2 0 346 6 3 0 888 7 3 0 999 8 3 0 777 来汇总数据,并且仅将id处的对应值设为1时,将col3的值附加到列表中。另外,对于(不同col2)在id中只有0,我喜欢col2的汇总值为0,而col2的汇总值为空。

这是当前代码:

col3

所需的输出应该是(理想情况下是在熊猫中一步实现):

df_test = pd.DataFrame({'id':[1, 1, 1, 2, 2, 2, 3, 3, 3], 'col2':[1, 1, 0, 1, 0, 0, 0, 0, 0], 'col3':[123, 234, 345, 456, 1243, 346, 888, 999, 777]})

df_test_agg = pd.pivot_table(df_test, index=['id'], values=['col2', 'col3'], aggfunc={'col2':np.max, 'col3':(lambda x:list(x))})

print (df_test_agg)

    col2              col3
id                        
1      1   [123, 234, 345]
2      1  [456, 1243, 346]
3      0   [888, 999, 777]

///////////////////////////////////////////////// //////////////////////////

编辑-试用ColdSpeed的解决方案

    col2              col3
id                        
1      1            [123, 234]
2      1            [456]
3      0            []

///////////////////////////////////////////////// //////////////////////////

编辑原始帖子以展示更多场景。

1 个答案:

答案 0 :(得分:1)

您可以预先过滤,然后使用groupby

df_test.query('col2 > 0').groupby('id').agg({'col2': 'max', 'col3': list})

    col2        col3
id                  
1      1  [123, 234]
2      1       [456]

这里的警告是,如果一个组只有零,那么该组将在结果中丢失。因此,要解决此问题,您可以使用where进行屏蔽:

(df_test.where(df_test.col2 > 0)
        .assign(id=df_test.id)
        .groupby('id')
        .agg({'col2': 'max', 'col3'lambda x: x.dropna().tolist()}))

    col2            col3
id                      
1    1.0  [123.0, 234.0]
2    1.0         [456.0]

要处理“ col2”中的0个组,我们可以使用

(df.assign(col3=df.col3.where(df.col2.astype(bool)))
   .groupby('id')
   .agg({'col2':'max', 'col3': lambda x: x.dropna().astype(int).tolist()}))

    col2        col3
id                  
1      1  [123, 234]
2      1       [456]
3      0          []