为了账号安全,请及时绑定邮箱和手机立即绑定

根据条件反转 DataFrame 行

根据条件反转 DataFrame 行

MYYA 2022-11-18 12:22:36
我有一个 DataFrame,如果满足条件,我将在其中尝试反转行顺序。数据框(df)是:    name    id  description0   a   String 1    lion1   b   String 1    snake2   c   String 1    bear3   d   String 1    tiger4   e   String 1    dog5   f   String 2    cat6   g   String 2    bird7   h   String 2    whale8   i   String 2    eagle9   j   String 2    rhino10  k   String 3    monkey11  l   String 3    lamb12  m   String 3    horse13  n   String 3    goat14  o   String 3    rabbit15  p   String 4    frog16  q   String 4    jaguar17  r   String 4    fox18  s   String 4    sloth19  t   String 4    beaver20  u   String 5    parrot21  v   String 5    dolphin22  w   String 5    seal23  x   String 5    spider24  y   String 5    panda对于等于 String 2 和 String 4 的 df ['id'] 行(基本上所有 id 为 % 2 == 0),我想颠倒该组中行的顺序。我正在寻找的输出 DataFrame 是:    name    id  description0   a   String 1    lion1   b   String 1    snake2   c   String 1    bear3   d   String 1    tiger4   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    monkey11  l   String 3    lamb12  m   String 3    horse13  n   String 3    goat14  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    parrot21  v   String 5    dolphin22  w   String 5    seal23  x   String 5    spider24  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。我认为上面的代码很好地说明了这一点。谢谢你的帮助,我有点被这个难住了。
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

利用:


#extract numbers from id and compare by % 2 == 0

mask = df['id'].str.extract('(\d+)', expand=False).astype(int) % 2 == 0

#lambda function for change order

f = lambda x: x.iloc[::-1]

#apply only for groups match condition

df[mask] = df[mask].groupby(df['id']).transform(f)

print (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     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


查看完整回答
反对 回复 2022-11-18
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

(

    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)

)


查看完整回答
反对 回复 2022-11-18
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信