Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.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_Numpy_Dataframe - Fatal编程技术网

Python 如何根据条件交换两行中的选定数据

Python 如何根据条件交换两行中的选定数据,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我是Python新手 假设我有DataFrame,并希望切换具有相似id的所有行的选定数据 例如: | id | Gender | Name | Hobby | Food | +------+--------+---------+------------+-----------+ | 1111 | Male | Robert | Swim | Ice-cream | | 1112 | Female | Natasha | Football |

我是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的人之间切换数据(在本例中仅限于爱好和食物),但姓名和性别保持不变

所以基本上,在第一排,身份证1111,性别是男性,名字是罗伯特-爱好是排球,食物是意大利面。 第二排,身份证1111,性别是女性名字是米萨-爱好是游泳,食物是冰淇淋。对ID1112也做同样的操作。 我目前没有任何想法,除了编写一些循环,然后使用空DataFramme进行附加和切换。
谢谢大家

我选择交换
Name
Gender
,而不是交换其他列:

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
     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
或者,如果坚持正确的顺序,则交换其他列:

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

我选择交换
Name
Gender
,而不是交换其他列:

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
     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
或者,如果坚持正确的顺序,则交换其他列:

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

您能提供一个预期的输出吗?似乎您需要的是按
id
对数据进行排序?我说的对吗?我刚刚提出了预期的输出,谢谢。有可能有两行以上的相同ID吗?如果是这样,第三排将如何处理?嗨,我不明白你的意思。如果您指的是第五行,那么由于没有匹配的id,它将不会被切换。请提供预期的输出。您需要的似乎是按
id
对数据进行排序?我说的对吗?我刚刚提出了预期的输出,谢谢。有可能有两行以上的相同ID吗?如果是这样,第三排将如何处理?嗨,我不明白你的意思。如果你指的是第五排,那么因为没有匹配的id,它不会被切换。我没有检查,但它看起来很神奇。我看不出您能够检查交换行之间的名称和\或性别是否不同。您好,在本例中,您可以这样做,但大多数情况下不是这样,我应该编写一个更难的示例。例如,如果id 1111 Robert在第0行,id 1111 Misa在第99行,我需要先找到它的位置,然后再切换。只要每个id最多有2行,它就可以工作。我知道了,谢谢,我会尝试一下,并将我的问题标记为resolvedI未检查,但它看起来很神奇。我看不出您能够检查交换行之间的名称和\或性别是否不同。您好,在本例中,您可以这样做,但大多数情况下不是这样,我应该编写一个更难的示例。例如,如果id 1111 Robert在第0行,id 1111 Misa在第99行,我需要先找到它的位置,然后再切换。只要每个id最多有2行,它就可以工作。我知道了,谢谢,我会尝试一下,并将我的问题标记为已解决