首页 > 解决方案 > 如何根据条件交换 2 行中的选定数据

问题描述

我是 Python 新手。

假设我有 DataFrame,并且想要切换具有相似 id 的所有行的选定数据。

例如:

|  id  | Gender |  Name   |   Hobby    |   Food    |
+------+--------+---------+------------+-----------+
| 1111 | Male   | Robert  | Swim       | Ice-cream |
| 1112 | Female | Natasha | Football   | Pizza     |
| 1111 | Female | Misa    | Volleyball | Pasta     |
| 1112 | Male   | Rick    | Sleep      | Hamburger |
| 1113 | Male   | Rondo   | Read       | Rice      |
+------+--------+---------+------------+-----------+



预期输出:

+------+--------+---------+------------+-----------+
|  id  | Gender |  Name   |   Hobby    |   Food    |
+------+--------+---------+------------+-----------+
| 1111 | Male   | Robert  | Volleyball | Pasta     |
| 1112 | Female | Natasha | Sleep      | Hamburger |
| 1111 | Female | Misa    | Swim       | Ice-cream |
| 1112 | Male   | Rick    | Football   | Pizza     |
| 1113 | Male   | Rondo   | Read       | Rice      |
+------+--------+---------+------------+-----------+

所以我想做的是在具有相同 id 的人之间切换数据(在这个例子中只有爱好和食物),但名字和性别保持不变。

所以基本上,在第一行,id 1111,性别是男性,名字是罗伯特 - 爱好是排球,食物是意大利面。在第二行,id 1111,性别是女性,名字是 Misa - 爱好是游泳,食物是冰淇淋。并为 id 1112 做同样的事情。目前我没有任何想法,除了编写一些循环然后使用空 DataFramme 来追加和切换。谢谢你们!!

标签: pythonpandasnumpydataframe

解决方案


我没有交换其他列,而是选择交换NameGender

def swap(x):
    x[['Gender','Name']] = x[['Gender','Name']].values[::-1]
    return x

df.groupby('id').apply(swap)

输出:

     id  Gender     Name       Hobby       Food
0  1111  Female     Misa        Swim   Icecream
1  1112    Male     Rick    Football      Pizza
2  1111    Male   Robert  Volleyball      Pasta
3  1112  Female  Natasha       Sleep  Hamburger
4  1113    Male    Rondo        Read       Rice

或者,如果您坚持正确的顺序,则交换其他列:

def swap2(x):
    x[['Hobby','Food']] = x[['Hobby','Food']].values[::-1]

    return x

print(df.groupby('id').apply(swap2))

输出:

     id  Gender     Name       Hobby       Food
0  1111    Male   Robert  Volleyball      Pasta
1  1112  Female  Natasha       Sleep  Hamburger
2  1111  Female     Misa        Swim   Icecream
3  1112    Male     Rick    Football      Pizza
4  1113    Male    Rondo        Read       Rice

推荐阅读