首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python大熊猫-如果其他列中的值匹配,则追加最后一列

Python大熊猫-如果其他列中的值匹配,则追加最后一列
EN

Stack Overflow用户
提问于 2017-02-20 13:49:40
回答 2查看 480关注 0票数 2

我已经创建了这个pandas

代码语言:javascript
复制
index        p1           p2  p3  p4
0    29.02.2017  10.00-11.00   1   2
1    29.02.2017  10.00-11.00   1   3
2    28.02.2017  08.00-09.00  10  11
3    28.02.2017  08.00-09.00  10  12
4    29.02.2017  08.00-09.00  10  13
5    29.02.2017  08.00-09.00  10   9
6    28.02.2017  08.00-09.00  11  10
7    28.02.2017  08.00-09.00  11  12
8    28.02.2017  10.00-11.00  11  13

值按p3>p1>p2>p4排序

我现在要做的是附加p4,如果p1,p2,p3匹配的话。

代码语言:javascript
复制
index        p1           p2  p3  p4
0    29.02.2017  10.00-11.00   1   2, 3 
2    28.02.2017  08.00-09.00  10  11, 12 
4    29.02.2017  08.00-09.00  10  13, 9
6    28.02.2017  08.00-09.00  11  10, 12
8    28.02.2017  10.00-11.00  11  13

我真的不知道该怎么做。我知道如何附加更多的行,或者如何总结值,但是我想保持它们和前面一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-20 13:52:06

您需要groupbyapplyjoin,但首先需要将数字列转换为string

代码语言:javascript
复制
df = df.groupby(['p1','p2','p3'], sort=False)['p4']
       .apply(lambda x: ', '.join(x.astype(str)))
       .reset_index()
print (df)
           p1           p2  p3      p4
0  29.02.2017  10.00-11.00   1    2, 3
1  28.02.2017  08.00-09.00  10  11, 12
2  29.02.2017  08.00-09.00  10   13, 9
3  28.02.2017  08.00-09.00  11  10, 12
4  28.02.2017  10.00-11.00  11      13

如果需要更快地输出列表,则使用:

代码语言:javascript
复制
print (df.groupby(['p1','p2','p3']).p4.apply(lambda x: x.tolist()))

时间

代码语言:javascript
复制
df = pd.concat([df]*10000).reset_index(drop=True)

In [306]: %timeit (df.groupby(['p1','p2','p3']).p4.apply(list))
10 loops, best of 3: 22.6 ms per loop

In [307]: %timeit (df.groupby(['p1','p2','p3']).p4.apply(lambda x: x.tolist()))
100 loops, best of 3: 18.4 ms per loop
票数 4
EN

Stack Overflow用户

发布于 2017-02-20 13:59:40

如果您希望值为list s,

以下是一个解决方案:

代码语言:javascript
复制
In [39]: df.groupby(['p3','p1','p2']).p4.apply(list)
Out[39]: 
p3  p1          p2         
1   29.02.2017  10.00-11.00      [2, 3]
10  28.02.2017  08.00-09.00    [11, 12]
    29.02.2017  08.00-09.00     [13, 9]
11  28.02.2017  08.00-09.00    [10, 12]
                10.00-11.00        [13]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42346323

复制
相关文章

相似问题

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