根据条件反转 DataFrame 行

我有一个 DataFrame,如果满足条件,我将在其中尝试反转行顺序。


数据框(df)是:


    name    id  description

0   a   String 1    lion

1   b   String 1    snake

2   c   String 1    bear

3   d   String 1    tiger

4   e   String 1    dog

5   f   String 2    cat

6   g   String 2    bird

7   h   String 2    whale

8   i   String 2    eagle

9   j   String 2    rhino

10  k   String 3    monkey

11  l   String 3    lamb

12  m   String 3    horse

13  n   String 3    goat

14  o   String 3    rabbit

15  p   String 4    frog

16  q   String 4    jaguar

17  r   String 4    fox

18  s   String 4    sloth

19  t   String 4    beaver

20  u   String 5    parrot

21  v   String 5    dolphin

22  w   String 5    seal

23  x   String 5    spider

24  y   String 5    panda

对于等于 String 2 和 String 4 的 df ['id'] 行(基本上所有 id 为 % 2 == 0),我想颠倒该组中行的顺序。我正在寻找的输出 DataFrame 是:


    name    id  description

0   a   String 1    lion

1   b   String 1    snake

2   c   String 1    bear

3   d   String 1    tiger

4   e   String 1    dog

**5 j   String 2    rhino**

**6 i   String 2    eagle**

**7 h   String 2    whale**

**8 g   String 2    bird**

**9 f   String 2    cat**

10  k   String 3    monkey

11  l   String 3    lamb

12  m   String 3    horse

13  n   String 3    goat

14  o   String 3    rabbit

**15    t   String 4    beaver**

**16    s   String 4    sloth**

**17    r   String 4    fox**

**18    q   String 4    jaguar**

**19    p   String 4    frog**

20  u   String 5    parrot

21  v   String 5    dolphin

22  w   String 5    seal

23  x   String 5    spider

24  y   String 5    panda

我有能力通过以下方式单独执行此操作:


df.loc[df['id'] == 'condition'][::-1]

我正在努力研究如何将它应用于 DataFrame 以便它对其进行修改。我尝试了以下功能无济于事:


def reversal(row):    

    for row in df.id:

        if row == 'condition':

            return df.loc[df['id'] == 'condition'][::-1]

我打算在大约 30K 行的 DataFrame 上使用它。这真的不是那么多,但我仍然注意尝试使用最有效的方法。


理解解决方案背后的逻辑对我来说同样重要,因为我才真正开始学习 Python。我认为上面的代码很好地说明了这一点。


谢谢你的帮助,我有点被这个难住了。


MYYA
浏览 161回答 2
2回答

素胚勾勒不出你

利用:#extract numbers from id and compare by % 2 == 0mask = df['id'].str.extract('(\d+)', expand=False).astype(int) % 2 == 0#lambda function for change orderf = lambda x: x.iloc[::-1]#apply only for groups match conditiondf[mask] = df[mask].groupby(df['id']).transform(f)print (df)   name        id description0     a  String 1        lion1     b  String 1       snake2     c  String 1        bear3     d  String 1       tiger4     e  String 1         dog5     j  String 2       rhino6     i  String 2       eagle7     h  String 2       whale8     g  String 2        bird9     f  String 2         cat10    k  String 3      monkey11    l  String 3        lamb12    m  String 3       horse13    n  String 3        goat14    o  String 3      rabbit15    t  String 4      beaver16    s  String 4       sloth17    r  String 4         fox18    q  String 4      jaguar19    p  String 4        frog20    u  String 5      parrot21    v  String 5     dolphin22    w  String 5        seal23    x  String 5      spider24    y  String 5       panda

慕田峪7331174

(    df.groupby('id')    .apply(lambda x: x.iloc[::-1] if int(x.id.iloc[0].strip('String '))%2==0 else x)    .reset_index(drop=True))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python