2017-07-14 72 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 ...谢谢反正! –