Панды: Как напечатать значения groupby - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий набор данных из Table_Record:

Seg_ID  Lock_ID  Code
111     100      1
222     121      2
333     341      2
444     100      1
555     100      1
666     341      2
777     554      4
888     332      5

Я использую запрос sql, чтобы найти Seg_IDs, где Lock_ID повторяется:

Select Code,Lock_ID,Seg_ID from Table_Record group by Code, Lock_ID;

Seg_ID  Lock_ID  Code
111     100      1
444     100      1
555     100      1
222     121      2
333     341      2
666     341      2
777     554      4
888     332      5

Как я могу достичь того же, используя Панд?

Excepted O/P from Pandas is:

Например.

Seg_ID (111,444,555) has Lock_id (1).
Seg_ID (222,333,666) has Lock_ID (2).

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Сначала получите все codes, отфильтровав только duplicated значений, а затем отфильтруйте исходные DaatFrame по boolean indexing с isin:

codes = df.loc[df.duplicated(['Lock_ID']), 'Code'].unique()

df1 = df[df['Code'].isin(codes)]
print (df1)
   Seg_ID  Lock_ID  Code
0     111      100     1
1     222      121     2
2     333      341     2
3     444      100     1
4     555      100     1
5     666      341     2

Затем groupby с f-string s:

for k, v in df1.groupby(['Code'])['Seg_ID']:
    print (f'Seg_ID {tuple(v)} has Code ({k})')

Seg_ID (111, 444, 555) has Code (1)
Seg_ID (222, 333, 666) has Code (2)

Если хотите выводить как DataFrame, используйте apply с tuple:

df2 = df1.groupby(['Code'])['Seg_ID'].apply(tuple).reset_index()
print (df2)
   Code           Seg_ID
0     1  (111, 444, 555)
1     2  (222, 333, 666)
0 голосов
/ 09 октября 2018

Просто используйте groupby .Как я понял из вашего кода, вы бы хотели:

 grouped= df.groupby(['Code']['LockId'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...