示例数据框:
pd.DataFrame({'Name':['John','Peter','John','John','Donald'],
'City':['Boston','Japan','Boston','Dallas','Japan'],
'Age':[23,31,21,21,22]})
我想要的是使用熊猫获取具有相同“名称”和“城市”但年龄不同的所有行的索引列表。
在这种情况下:它应该返回[0,2]
答案 0 :(得分:3)
尝试以下操作:
df[df.duplicated(['Name','City'],keep=False)&~df.duplicated(keep=False)]
Name City Age
0 John Boston 23
2 John Boston 21
编辑:@ALollz指出的场景可以使用:
df = pd.DataFrame({'Name':['John','Peter','John','John','Donald', 'John'],
'City':['Boston','Japan','Boston','Dallas','Japan', 'Boston'],
'Age':[23,31,21,21,22, 23]})
df[df.duplicated(['Name','City'],keep=False)].drop_duplicates()
输出:
Name City Age
0 John Boston 23
2 John Boston 21
答案 1 :(得分:1)
我想要获取具有“名称”和“城市”但年龄不同的所有行的索引列表
我认为这有点模棱两可,因为如果“名称城市”组包含相同年龄但有些不同的条目怎么办?根据您所需的输出,groupby
+ transform
+ nunique
可能需要过滤。
请注意,我在此处添加了一个小写字母,其中John Boston 23
是重复的:
import pandas as pd
df = pd.DataFrame({'Name':['John','Peter','John','John','Donald', 'John'],
'City':['Boston','Japan','Boston','Dallas','Japan', 'Boston'],
'Age':[23,31,21,21,22, 23]})
# Name City Age
#0 John Boston 23
#1 Peter Japan 31
#2 John Boston 21
#3 John Dallas 21
#4 Donald Japan 22
#5 John Boston 23
df[df.groupby(['Name', 'City']).Age.transform(pd.Series.nunique).gt(1)]
# Name City Age
#0 John Boston 23
#2 John Boston 21
#5 John Boston 23
在其他解决方案中,精确的重复可能会导致不必要的输出:
df[df.duplicated(['Name','City'],keep=False)&~df.duplicated(keep=False)]
# Name City Age
#2 John Boston 21
答案 2 :(得分:0)
另一种方法可以通过使用groupby():
df[df.groupby(['Name', 'City']).transform(len)['Age']>1]
或者可能与使用重复的()一样分两个步骤:
df =df.set_index('Age')
df[df.duplicated(['Name', 'City'], keep = False)].reset_index()