如何根据条件在2行中交换所选数据

时间:2019-09-18 19:49:40

标签: python pandas numpy dataframe

我是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,性别是男性,名字是罗伯特-爱好是排球,食物是面食。 在第二排,编号1111,性别是女性,名字是Misa-爱好是游泳,食物将是冰淇淋。并为id 1112做同样的事情。 我目前没有任何想法,除了编写一些循环然后使用空的DataFramme追加和切换。 谢谢大家!

1 个答案:

答案 0 :(得分:0)

我选择交换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