簡體   English   中英

將 groupby 后的函數應用結果復制到 Pandas 列中

[英]Copying results of a function apply after groupby into a pandas column

我正在嘗試做一個相當於以下data.table操作的pandas

dt <- data.table(id = 1:10, x = rnorm(40))
dt <- dt[order(id)]
dt[, diff_x := c(0,diff(x)), by = id]

head(dt, 12)

# output:
    id           x      diff_x
 1:  1  0.01419519  0.00000000
 2:  1 -0.39539869 -0.40959388
 3:  1 -0.43918689 -0.04378821
 4:  1 -0.79905967 -0.35987278
 5:  2  0.59555572  0.00000000
 6:  2 -0.21933639 -0.81489211
 7:  2 -0.65462968 -0.43529329
 8:  2  0.99307684  1.64770652
 9:  3 -1.31185544  0.00000000
10:  3  1.23649358  2.54834902
11:  3  0.66359594 -0.57289764
12:  3  1.77078647  1.10719053

首先,我不確定如何使用我上面所做的填充以簡單的方式進行diff ,因此我為此編寫了自己的函數。 但是,更重要的是,我不知道怎么我的結果復制groupby操作回到我的pandas數據幀作為新列(我這樣做很容易與上面的方式data.table )。 這是我到目前為止嘗試過的:

def diff_pad(vect):
    return(np.concatenate([[0], np.diff(vect)]))

df = pd.DataFrame()
df['id'] = list((range(1,11))) * 4
df.sort(['id'], inplace=True)
df['x'] = rand(40)

diffz = df.groupby('id')['x'].apply(diff_pad)

df['diffz'] = diffz
print(df.head(10))

#out:
    id         x                                              diffz
0    1  0.757153                                                NaN
30   1  0.869001                                                NaN
10   1  0.140684  [0.0, 0.362003972215, -0.742119725957, -0.0684...
20   1  0.791483                                                NaN
21   2  0.941333                                                NaN
1    2  0.504867  [0.0, 0.111848720078, -0.728317633944, 0.65079...
31   2  0.273321                                                NaN
11   2  0.118802                                                NaN
2    3  0.848048  [0.0, -0.436465430463, -0.231545666932, -0.154...
12   3  0.357192                                                NaN

編輯:

在 R/data.table 中,我可以應用任意函數,該函數采用by另一組列分組的表中的任何列,並將結果分配給新列。

例如:

library(data.table)

dt <- data.table(id = 1:10, x = rnorm(40), y = rnorm(40))
dt <- dt[order(id)]

my_funct <- function(x, y) {
  return(sqrt(max(x)^2 + min(y)^2))
}

dt[, z := my_funct(x, y), by = id]

head(dt, 12)


# out:

    id           x          y         z
 1:  1  0.26012913  0.7612974 1.2433969
 2:  1  1.19113080  1.4228528 1.2433969
 3:  1 -0.07970657 -0.3567118 1.2433969
 4:  1 -0.33129374  0.7879845 1.2433969
 5:  2  0.60868698  0.9716669 0.8872687
 6:  2 -0.72751776  0.0392282 0.8872687
 7:  2 -0.17724141  0.2599093 0.8872687
 8:  2  0.13324134 -0.6455587 0.8872687
 9:  3 -1.91015664 -1.1340993 2.2408919
10:  3 -0.95696559 -0.2624625 2.2408919
11:  3  1.93272221  0.2788335 2.2408919
12:  3  0.46391776 -0.9080321 2.2408919

我將如何在熊貓中做這樣的事情?

第一關,歡迎來到熊貓!

其次,我會像這樣定義df 這是我的風格偏好,絕不是規范的。

import numpy as np
import pandas as pd

df = pd.DataFrame(dict(
        id=np.repeat(np.arange(1, 11), 4),
        x=np.random.randn(40)
    ))

最后,如果我理解正確的話:

df['x_diff'] = df.groupby('id').x.diff().fillna(0)
df

在此處輸入圖片說明


您可以將apply與您自己的函數一起使用,如下所示:

def my_diff(x):
    return x.diff().fillna(0)

df.groupby('id').apply(my_diff)

你的不起作用的原因是因為你返回了一個沒有索引值的 numpy 數組來與你的函數所應用的熊貓系列對齊。 您在結果中看到答案就在那里,但它被塞進了一個單元格中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM