首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas -按多列分组并保留多列-

Pandas -按多列分组并保留多列-
EN

Stack Overflow用户
提问于 2020-03-05 22:06:14
回答 2查看 806关注 0票数 0

我有一个数据帧

代码语言:javascript
复制
    action  person_id                       frame_no        path
0   boxing  person12_boxing_d2_uncomp.avi   image_0128.jpg  ../../../datasets/kth/train/boxing/person12_bo...
1   boxing  person12_boxing_d2_uncomp.avi   image_0129.jpg  ../../../datasets/kth/train/boxing/person12_bo...
2   walking person13_boxing_d2_uncomp.avi   image_0130.jpg  ../../../datasets/kth/train/walking/person13_b...
3   walking person13_boxing_d2_uncomp.avi   image_0131.jpg  ../../../datasets/kth/train/walking/person13_b...
4   running person13_boxing_d2_uncomp.avi   image_0132.jpg  ../../../datasets/kth/train/running/person13_b.

我正在尝试合并具有相同person_id的行。具有相同person_id的行将肯定具有相同的action。这是我目前所拥有的

代码语言:javascript
复制
df = pd.DataFrame(data_filtered, columns=["action","person_id","frame_no","path"])
#df = pd.DataFrame(df.groupby(["action","person_id"])['frame_no'].apply(list)).reset_index()
df.head()

但是数据框丢失了path列。我不确定如何告诉pandas对剩下的列进行分组,在google上搜索也没有帮助,因为我甚至不知道要搜索什么。如果有人反复问我这个问题,我很抱歉。

@ Aditya

我试过了

代码语言:javascript
复制
df = pd.DataFrame(df.groupby(["action","person_id"])[['frame_no', 'path']].apply(list)).reset_index()

但这就是我得到的

代码语言:javascript
复制
    action  person_id                       0
0   boxing  person12_boxing_d2_uncomp.avi   [frame_no, path]
1   running person13_boxing_d2_uncomp.avi   [frame_no, path]
2   walking person13_boxing_d2_uncomp.avi   [frame_no, path]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-05 22:22:50

代码语言:javascript
复制
# pd.__version__ == 0.25.1
d=[['hello',1,'GOOD','long.kw'],
   ['chipotle',2,'GOOD','bingo'],
   ['hello',3,"BAD", "lm"]]
t=pd.DataFrame(data=d, columns=['A','B','C','D'])

输出为

代码语言:javascript
复制
t.groupby('A')[['B','C']].agg(lambda x: tuple(x)).applymap(list)
               B            C
A
chipotle     [2]       [GOOD]
hello     [1, 3]  [GOOD, BAD]
票数 2
EN

Stack Overflow用户

发布于 2020-03-05 22:26:18

对于将每列转换为列表,仅将GroupBy.apply更改为GroupBy.agg

代码语言:javascript
复制
print (df)
    action                      person_id        frame_no         path
0   boxing  person12_boxing_d2_uncomp.avi  image_0128.jpg  person12_bo
1   boxing  person12_boxing_d2_uncomp.avi  image_0129.jpg  person12_bo
2  walking  person13_boxing_d2_uncomp.avi  image_0130.jpg   person13_b
3  walking  person13_boxing_d2_uncomp.avi  image_0131.jpg   person13_b
4  running  person13_boxing_d2_uncomp.avi  image_0132.jpg   person13_b

df = df.groupby(["action","person_id"])['frame_no', 'path'].agg(list)
print (df)
                                                               frame_no  \
action  person_id                                                         
boxing  person12_boxing_d2_uncomp.avi  [image_0128.jpg, image_0129.jpg]   
running person13_boxing_d2_uncomp.avi                  [image_0132.jpg]   
walking person13_boxing_d2_uncomp.avi  [image_0130.jpg, image_0131.jpg]   

                                                             path  
action  person_id                                                  
boxing  person12_boxing_d2_uncomp.avi  [person12_bo, person12_bo]  
running person13_boxing_d2_uncomp.avi                [person13_b]  
walking person13_boxing_d2_uncomp.avi    [person13_b, person13_b]  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60547183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档