Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于条件反转数据帧行_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于条件反转数据帧行

Python 基于条件反转数据帧行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,在该数据帧中,如果满足条件,我将尝试反转行顺序 数据帧(df)是: 对于等于字符串2和字符串4的df['id']行(基本上所有id均为%2==0),我希望颠倒该组中行的顺序。我正在寻找的输出数据帧是: 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 Str

我有一个数据帧,在该数据帧中,如果满足条件,我将尝试反转行顺序

数据帧(df)是:

对于等于字符串2和字符串4的df['id']行(基本上所有id均为%2==0),我希望颠倒该组中行的顺序。我正在寻找的输出数据帧是:

    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]
我正在努力研究如何将它应用于数据帧,以便它能够修改它。我尝试了以下功能,但无效:

def reversal(row):    
    for row in df.id:
        if row == 'condition':
            return df.loc[df['id'] == 'condition'][::-1]
我的目的是在大约30K行的数据帧上使用它。这其实不算多,但我仍然注意尝试使用最有效的方法

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

谢谢你的帮助,我在这件事上有点不知所措

使用:

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

添加您的代码。您添加的只是数据,而不是python代码。谷歌你想做什么,并得到一个基本的代码样本。即使代码有缺陷,发布代码也会使回答问题更容易。因此,如果您添加代码,您也将从获得更好的反馈中获益^^^是的,谢谢。在我完成并格式化之前,我无意中提交了问题。我编辑过。是的,没错。除索引外的所有列。谢谢你,谢谢你@jezrael。看起来我的掩码出现了一个值错误。以下是回溯:--------------------------------------------------------------------------------------1中的ValueError回溯(最近一次调用last)#从id中提取数字并通过%2==0-->2 mask=df['round'].str.extract('(\d+),expand=False)进行比较。aType(int)%2==0 3#变更单4的lambda函数f=lambda x:x.iloc[:-1]5#仅适用于组匹配条件特别是:ValueError:无法将浮点NaN转换为整数。再次感谢您,我会努力解决它。@souted-id中总是有数字吗?是否可能某些组没有数字?因为如果没有数字会丢失值,那么请尝试将解决方案改为
.astype(float)
,而不是
.astype(int)
。是的,唯一的区别是“round”一词取代了“String”,但其他方面都一样。我将根据建议修改为float类型。谢谢更新:将astype更改为float成功了。再次感谢。
(
    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)
)
#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