2017-09-04 82 views
1

我有一個包含兩列的數據集,我想對特定列執行一些操作並完全獲取新的數據框。考慮這個作爲我的數據集:在特定條件下從列中減去值並獲取新的數據框

A B 
1 01 
1 56 
1 89 
1 108 
2 23 
2 36 
2 89 
3 13 
4 45 

我想對列B執行兩個操作,並創建這兩列的數據幀。第一列將是1的最高數字,即 - 108減去至少1(108 - 1),2 - (89 - 23),如果它的單個實例,它應該直接爲0.第二列將是一個特定的(125-1),(125-23),(125-13)...我們應該得到類似這樣的結果:

A C  D 
1 107 124 
2 66 102 
3 0 112 
4 0 80 

我正在考慮使用.loc來查找值的具體位置,然後減去它,我應該怎麼做?

回答

0
u = df.groupby('A').agg(['max', 'min', 'first']) 
u.columns = 'max', 'min', 'first' 
u['C'] = u['max'] - u['min'] 
u['D'] = 125 - u['first'] 
del u['min'] 
del u['max'] 
del u['first'] 
u.reset_index() 
# A C D 
#0 1 107 124 
#1 2 66 102 
#2 3 0 112 
#3 4 0 80 
+0

可能下降應該像德爾3倍更好;) – jezrael

2

使用agg通過first與拉姆達自定義函數,然後重命名列。減去125D

df = df.groupby('A')['B'].agg([lambda x: x.max() - x.min(), 'first']) \ 
         .rename(columns={'first':'D','<lambda>':'C'}) \ 
         .assign(D= lambda x: 125 - x['D']) \ 
         .reset_index() 
print (df) 
    A C D 
0 1 107 124 
1 2 66 102 
2 3 0 112 
3 4 0 80 

rename是必要的,因爲deprecate groupby agg with a dictionary when renaming

另一種解決方案:

df = df.groupby('A')['B'].agg(['min','max', 'first']) \ 
         .rename(columns={'first':'D','min':'C'}) \ 
         .assign(D=lambda x: 125 - x['D'], C=lambda x: x['max'] - x['C']) \ 
         .drop('max', axis=1) \ 
         .reset_index() 
print (df) 
    A C D 
0 1 107 124 
1 2 66 102 
2 3 0 112 
3 4 0 80 
+1

您可能要檢查OP的輸出'D'。 – Zero

+0

D的輸出有一些問題,請您再次檢查@jezrael – Sahil

+0

是的,第一種解決方案很糟糕,但現在它是正確的。對不起。 – jezrael

0

你可以

In [1494]: df.groupby('A', as_index=False).B.agg(
       {'C': lambda x: x.max() - x.min(), 'D': lambda x: 125-x.iloc[0]}) 
Out[1494]: 
    A C D 
0 1 107 124 
1 2 66 102 
2 3 0 112 
3 4 0 80 
相關問題