【问题标题】:Operating on multiple rows in pandas groupby在 pandas groupby 中对多行进行操作
【发布时间】:2018-02-01 17:26:47
【问题描述】:

我正在尝试对 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.startend 之间的差异。 我该怎么做?

我尝试了一个 apply 函数,它似乎返回了一个系列。但是除了'd'之外的所有东西我都得到NaN。我想我不确定如何从每个组中所有其他任务的“开始”值中减去 d.end。

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    考虑使用pivot()sub()

    df2 = df.pivot(columns="task", index="jobid")
    df2.end.sub(df2.start.d, axis=0)
    

    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
    

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 1970-01-01
      • 2015-09-09
      • 2018-11-09
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多