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