簡體   English   中英

在 python 中使用 agg 用於 pd.dataframe 和自定義函數,其輸入是多個數據幀列

[英]use agg in python for pd.dataframe wiht customized function whose inputs are multiple dataframe columns

我有一個這樣的數據框。

mydf = pd.DataFrame({'a':[1,1,3,3],'b':[np.nan,2,3,6],'c':[1,3,3,9]})

   a    b  c
0  1  NaN  1
1  1  2.0  3
2  3  3.0  3
3  3  6.0  9

我想要這樣的結果數據框。

myResults = pd.concat([mydf.groupby('a').apply(lambda x: (x.b/x.c).max()), mydf.groupby('a').apply(lambda x: (x.c/x.b).max())], axis =1)
myResults.columns = ['b_c','c_b']

        b_c       c_b
a
1  0.666667      1.5
3  1.000000      1.5

基本上我想有max和的比率的分column bcolumn c的每個組(由分組column a

如果可以通過agg實現這一點? 我試過mydf.groupby('a').agg([lambda x: (xb/xc).max(), lambda x: (xc/xb).max()]) 它不起作用,並且似乎無法識別列名bc

有沒有更好的方法來通過 agg 或其他功能實現這一點(最好在一行中)? 總之,我想將自定義函數應用於分組的DataFrame,並且自定義函數需要從原始DataFrame中讀取多個列(可能比上面提到的b和c列多)。

一種方法

def func(x):
    C= (x['b']/x['c']).max()
    D= (x['c']/x['b']).max()
    return pd.Series([C, D], index=['b_c','c_b'])
mydf.groupby('a').apply(func).reset_index()

輸出

    a        b_c    c_b
0   1   0.666667    1.5
1   3   1.000000    1.5

通過assign新的臨時列添加到數據框,然后執行groupbymax函數。 此方法應提供顯着的性能優勢。

>>> (mydf
     .assign(b_c=df['b'].div(df['c']), c_b=df['c'].div(df['b']))
     .groupby('a')[['b_c', 'c_b']]
     .max()
    )
        b_c  c_b
a               
1  0.666667  1.5
3  1.000000  1.5

時間安排

# Sample data.
n = 1000  # Sample data number of rows = 4 * n.
data = {
    'a':  list(range(n)) * 4, 
    'b': [np.nan, 2, 3, 6] * n,
    'c': [1, 3, 3, 9] * n
}
df = pd.DataFrame(data)

# Solution 1.
%timeit df.assign(b_c=df['b'].div(df['c']), c_b=df['c'].div(df['b'])).groupby('a')[['b_c', 'c_b']].max()
# 3.96 ms ± 152 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# Solution 2.
def func(x):
    C= (x['b']/x['c']).max()
    D= (x['c']/x['b']).max()
    return pd.Series([C, D], index=['b_c','c_b'])

%timeit df.groupby('a').apply(func)
# 1.09 s ± 56.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

兩種解決方案都給出相同的結果。

暫無
暫無

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

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