Python 如何根据条件交换两行中的选定数据
我是Python新手 假设我有DataFrame,并希望切换具有相似id的所有行的选定数据 例如: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 |
| 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行,它就可以工作。我知道了,谢谢,我会尝试一下,并将我的问题标记为已解决