2017-07-14 77 views
1

我想顛倒我的數據框中的列值,但只能在單個「groupby」級別上顛倒。下面你可以找到一個最小的示範例子,在這裏我要屬於同一字母A到「翻轉」的價值觀,B或C:Pandas反向列值組

df = pd.DataFrame({"group":["A","A","A","B","B","B","B","C","C"], 
        "value": [1,3,2,4,4,2,3,2,5]}) 

    group value 
0  A  1 
1  A  3 
2  A  2 
3  B  4 
4  B  4 
5  B  2 
6  B  3 
7  C  2 
8  C  5 

我期望的輸出結果如下:(列被添加,而不是取代只爲簡潔的目的)

group value value_desired 
0  A  1    2 
1  A  3    3 
2  A  2    1 
3  B  4    3 
4  B  4    2 
5  B  2    4 
6  B  3    4 
7  C  2    5 
8  C  5    2 

與往常一樣,我沒有看到一個適當的矢量風格的做法,我結束與循環搞亂只是爲了最終輸出的緣故,但我當前的代碼傷害我非常太多:

for i in list(set(df["group"].values.tolist())): 
    reversed_group = df.loc[df["group"]==i,"value"].values.tolist()[::-1] 
    df.loc[df["group"]==i,"value_desired"] = reversed_group 

熊貓大師,請告訴我的方式:)

回答

3

您可以使用transform

In [900]: df.groupby('group')['value'].transform(lambda x: x[::-1]) 
Out[900]: 
0 2 
1 3 
2 1 
3 3 
4 2 
5 4 
6 4 
7 5 
8 2 
Name: value, dtype: int64 

詳細

In [901]: df['value_desired'] = df.groupby('group')['value'].transform(lambda x: x[::-1]) 

In [902]: df 
Out[902]: 
    group value value_desired 
0  A  1    2 
1  A  3    3 
2  A  2    1 
3  B  4    3 
4  B  4    2 
5  B  2    4 
6  B  3    4 
7  C  2    5 
8  C  5    2 
+0

謝謝!變形爲救援!我碰巧知道 - 你可以如此善良,並向我展示應用風格的方法,因爲我有一些麻煩區分兩者... –

+0

'df.groupby('group')['value']。apply (lambda x:x [:: - 1])'? – Zero

+0

這隻適用於我,如果我加了'values'和這一行的結尾。否則,我會引發錯誤'TypeError:插入的列與幀索引不兼容的索引。看起來像原始索引變換返回系列,應用返回multindex ...謝謝反正! –