在pandas groupby中的多行操作

时间:2017-08-24 00:50:19

标签: python pandas

我正在尝试对groupby的所有行进行操作。 基本上我有以下内容:

import pandas as pd
import numpy as np

def tdiff(dff):
#    return(dff[dff.task.eq('d')].start - dff[dff.task.ne('d')].end)
    return(dff[dff.task.eq('d')].start - dff.end)

a = []
p = 0
while p < 6:
    i = 0
    while i < 4:
        a.insert(i,p)
        i = i + 1
    p = p + 1

d={'task':pd.Series(6*['a','b','c','d'],name='task'),
    'jobid':pd.Series(a),
    'start':pd.Series(np.random.randn(24)),
    'end':pd.Series(np.random.randn(24))}

df = pd.DataFrame(d)

print(df)

dt = df.groupby('jobid').apply(tdiff)
dt.name='tdiff'
print(type(dt))
print(dt)

除了我在每组中有十几个不同的'任务'(a,b,c,d,.... z)。并非所有组都能保证除了任务“d”之外的所有任务都能得到保证。任务'd'旁边还有至少1个任务。

在每个groupby结果中,我希望区分所有其他任务的 d.start end 。 我该怎么做?

我尝试了一个应用功能,似乎确实返回了一个系列。但是除了'd'之外,我得到了NaN。我想我不知道如何从每组中所有其他任务的“开始”值中减去d.end。

谢谢!

1 个答案:

答案 0 :(得分:2)

考虑使用pivot()sub()

df

从OP代码生成 end jobid start task 0 -1.223702 5 -0.458517 a 1 0.045843 5 -0.676103 b 2 -0.661233 5 1.213528 c 3 -0.339473 5 0.090109 d 4 2.474916 4 0.069272 a 5 0.562003 4 0.307962 b 6 0.286008 4 -0.045996 c 7 0.770700 4 1.053486 d 8 -0.948754 3 -0.173639 a 9 0.576441 3 -1.085345 b 10 0.098523 3 1.399861 c 11 0.983254 3 -0.976588 d 12 -0.286155 2 -0.542215 a 13 -1.959281 2 -0.436720 b 14 1.020525 2 1.050937 c 15 0.815528 2 2.173647 d 16 0.158771 1 -2.584689 a 17 0.239464 1 0.521442 b 18 0.463753 1 -0.919359 c 19 0.430110 1 -0.996819 d 20 0.084908 0 0.599807 a 21 0.615123 0 -1.563351 b 22 -0.027279 0 -0.755369 c 23 0.826941 0 2.228655 d

sub()

task a b c d jobid 0 -2.143747 -1.613532 -2.255934 -1.401714 1 1.155591 1.236284 1.460572 1.426930 2 -2.459802 -4.132928 -1.153122 -1.358119 3 0.027834 1.553029 1.075111 1.959842 4 1.421430 -0.491483 -0.767478 -0.282786 5 -1.313812 -0.044266 -0.751343 -0.429582 的输出:

    <section id="feature-courses" class="pt pt-sm-80 feature-section">
        <div class="wow fadeInLeft container text-center">
            <h2>Cursos de Inglés Destacados</h2>
            <div class="spacer-60"></div>
            <div class="row">
                <?php echo do_shortcode("[slide-anything id="2320"]"); ?>
            </div>
        </div>
    </section>