我已经创建了这个pandas表
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匹配的话。
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我真的不知道该怎么做。我知道如何附加更多的行,或者如何总结值,但是我想保持它们和前面一样。
发布于 2017-02-20 13:52:06
您需要groupby和apply和join,但首先需要将数字列转换为string:
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如果需要更快地输出列表,则使用:
print (df.groupby(['p1','p2','p3']).p4.apply(lambda x: x.tolist()))时间
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发布于 2017-02-20 13:59:40
如果您希望值为list s,
以下是一个解决方案:
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]https://stackoverflow.com/questions/42346323
复制相似问题