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

数据集为:


   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,并且col3仅当其对应的值为col21时才将 的值附加到列表中。此外,对于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]

所需的输出应该是(最好在 Pandas 中一步完成):


    col2              col3

id                        

1      1            [123, 234]

2      1            [456]

3      0            []

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


编辑 - 尝试 ColdSpeed 的解决方案


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]})


print (df_test)


df_test_agg = (df_test.where(df_test.col2 > 0)

    .assign(id=df_test.id)

    .groupby('id')

    .agg({'col2': 'max', 'col3': lambda x: x.dropna().tolist()}))


print (df_test_agg)


   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

    col2            col3

id                      

1    1.0  [123.0, 234.0]

2    1.0         [456.0]

3    NaN              []

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


编辑原始帖子以呈现更多场景。


DIEA
浏览 169回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python