为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2021-10-26 16:07:29
数据集为:   id  col2  col30   1     1   1231   1     1   2342   1     0   3453   2     1   4564   2     0  12435   2     0   3466   3     0   8887   3     0   9998   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              col3id                        1      1   [123, 234, 345]2      1  [456, 1243, 346]3      0   [888, 999, 777]所需的输出应该是(最好在 Pandas 中一步完成):    col2              col3id                        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  col30   1     1   1231   1     1   2342   1     0   3453   2     1   4564   2     0  12435   2     0   3466   3     0   8887   3     0   9998   3     0   777    col2            col3id                      1    1.0  [123.0, 234.0]2    1.0         [456.0]3    NaN              []////////////////////////////////////////////////// ///////////////////////////////////////编辑原始帖子以呈现更多场景。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信