Фрейм данных для удаления последовательных дублированных строк с одинаковым содержимым по столбцам - PullRequest
1 голос
/ 07 февраля 2020

Фрейм данных ниже, и я хочу удалить последовательные дублированные строки, когда «Люди», «Год» и «Проект» совпадают.

Если исходный фрейм данных, как показано ниже, строки с те же «Люди», «Год», «Проект», если они последовательно, должны быть удалены.

data = {'People' : ["David","David","David","David","John","John","John"],
'Year': ["2016","2016","2017","2016","2016","2017","2017",],
'Project' : ["TN","TN","TN","TN","DJ","DM","DM"],
'Earning' : [878,682,767,620,964,610,772]}

Я пробовал это, но это не работает:

df_1 = df.loc[(df['People', 'Year', 'Project'].shift() != df['People', 'Year', 'Project'])]

попытка - эта строка удаляет непоследовательный «Дэвид, 2016, TN, 620»

df_1 = df.drop_duplicates(subset=['People','Year','Project'])

enter image description here

при изменении на это сохраняет все ряды:

df_1 = df.drop_duplicates(subset=['People','Year','Project', 'Earning'])

Какой правильный способ сделать это? Спасибо!

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете сравнить DataFrame.shift ed значения для не равных, а затем проверить по крайней мере один True на строки по DataFrame.any с boolean indexing:

cols = ['People','Year','Project']
df_1 = df[df[cols].ne(df[cols].shift()).any(axis=1)]
print (df_1)
  People  Year Project  Earning
0  David  2016      TN      878
2  David  2017      TN      767
3  David  2016      TN      620
4   John  2016      DJ      964
5   John  2017      DM      610

Подробности :

print (df[cols].ne(df[cols].shift()))
   People   Year  Project
0    True   True     True
1   False  False    False
2   False   True    False
3   False   True    False
4    True  False     True
5   False   True     True
6   False  False    False

print (df[cols].ne(df[cols].shift()).any(axis=1))
0     True
1    False
2     True
3     True
4     True
5     True
6    False
dtype: bool
...