2016-12-21 6 views
2

У меня есть dataframe, в котором каждая строка повторяется 3 раза. Пройдя через него, как я могу определить, видел ли я строку раньше и затем что-то делал, то есть печатал что-то во втором вхождении в цикл?Подсчет числа строк при прохождении через dataframe

print df 
     user  date 
0  User001 2014-11-01 
40  User001 2014-11-01 
80  User001 2014-11-01 
120 User001 2014-11-08 
200 User001 2014-11-08 
160 User001 2014-11-08 
280 User001 2014-11-15 
240 User001 2014-11-15 
320 User001 2014-11-15 
400 User001 2014-11-22 
440 User001 2014-11-22 
360 User001 2014-11-22 
... ...... .......... 
... ...... .......... 
1300 User008 2014-11-22 
1341 User008 2014-11-22 
1360 User008 2014-11-22 

for line in df.itertuples(): 
    user = line[1] 
    date = line[2] 

    print user, date 
    #do something after second occurrence of tuple i.e. print "second occurrence" 

('User001', '2014-11-01') 
('User001', '2014-11-01') 
second occurrence 
('User001', '2014-11-01') 
('User001', '2014-11-08') 
('User001', '2014-11-08') 
second occurrence 
('User001', '2014-11-08') 
('User001', '2014-11-15') 
('User001', '2014-11-15') 
second occurrence 
('User001', '2014-11-15') 
('User001', '2014-11-22') 
('User001', '2014-11-22') 
second occurrence 
('User001', '2014-11-22') 
('User008', '2014-11-22') 
('User008', '2014-11-22') 
second occurrence 
('User008', '2014-11-22') 

ответ

2

Вы можете использовать cumcount для поиска всех индексов второй встречаемости:

mask = df.groupby(['user', 'date']).cumcount() == 1 
idx = mask[mask].index 
print (idx) 
Int64Index([40, 200, 240, 440], dtype='int64') 
for line in df.itertuples(): 
    print (line.user) 
    print (line.date) 
    if line.Index in idx: 
     print ('second occurrence') 

User001 
2014-11-01 
User001 
2014-11-01 
second occurrence 
User001 
2014-11-01 
User001 
2014-11-08 
User001 
2014-11-08 
second occurrence 
User001 
2014-11-08 
User001 
2014-11-15 
User001 
2014-11-15 
second occurrence 
User001 
2014-11-15 
User001 
2014-11-22 
User001 
2014-11-22 
second occurrence 
User001 
2014-11-22 

Другим решением для индексов находки:

idx = df[df.duplicated(['user', 'date']) & 
     df.duplicated(['user', 'date'], keep='last')].index 
print (idx) 
Int64Index([40, 200, 240, 440], dtype='int64') 
1

Я бы посоветовал использовать DataFrame.duplicated() method, чтобы получить логический индекс идентификация повторяющихся строк.

В зависимости от того, как вы хотите, чтобы отобразить дублирования, вы можете использовать это по-разному, но если вы хотите перебрать строки и распечатать уведомление для каждого из них, который является дубликатом, что-то подобное может работать:

duplicate_index = df.duplicates() 
for row, dupl in zip(df, duplicate_index): 
    print(row[0], row[1]) 
    if dupl: 
     print('second occurrence') 
1

Использование Counter для отслеживания

from collections import Counter 

seen = Counter() 
for i, row in df.iterrows(): 
    tup = tuple(row.values.tolist()) 
    if seen[tup] == 1: 
     print(tup, ' second occurence') 
    else: 
     print(tup) 
    seen.update([tup]) 

('User001', '2014-11-01') 
('User001', '2014-11-01') second occurence 
('User001', '2014-11-01') 
('User001', '2014-11-08') 
('User001', '2014-11-08') second occurence 
('User001', '2014-11-08') 
('User001', '2014-11-15') 
('User001', '2014-11-15') second occurence 
('User001', '2014-11-15') 
('User001', '2014-11-22') 
('User001', '2014-11-22') second occurence 
('User001', '2014-11-22') 
('User008', '2014-11-22') 
('User008', '2014-11-22') second occurence 
('User008', '2014-11-22') 
Смежные вопросы