Найдите повторяющиеся строки одного столбца, затем добавьте соответствующие строки других столбцов. - PullRequest
0 голосов
/ 24 октября 2018

Я хочу проверить дубликаты строк одного столбца и добавить соответствующие строки других столбцов.Если дата имеет следующий вид:

 A     B         C         D  E  F  G  
13348  xyzqr     324580    1  1  1  1
13348  grpret    325810    4  4  4  4
45832  gberthh   258729    2  1  3  4
45832  bhdrffe   025892    2  1  1  4
58712  bgrtw     984562    2  2  2  2
76493  hzrt      638495    1  1  1  2
643509 .         T648501   1  1  1  1
643509 .         R648501   1  1  1  1

После добавления соответствующих строк столбцов (B, C, D, E, F) необходимо проверить, равны ли все столбцы соответствующих строк.Если равно, присвойте тот же номер другому столбцу, иначе «0».
Для приведенного выше примера, поскольку есть две повторяющиеся строки по 13348, и добавление соответствующих строк дает 5 для каждого столбца (D = 5, E = 5, F = 5, G = 5), поэтому на выходе должно быть 5. Принимая во внимание, что для 45832 после добавления добавляются другие значения столбца (D = 4, E = 2, F = 4, G = 8), поэтому на выходе должно быть 0.
Оставшийся столбец должен быть минимальными значениями индекса дублирующихся строк.

Вывод должен быть следующим:

   A     B       C       D 
  13348  xyzqr   324580  5
  45832  gberthh 258729  0
  58712  bgrtw   984562  2
  76493  hzrt    638495  0
  643509 .       T648501 2

Мне приятно знать некоторые предложения.

1 Ответ

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

Я думаю, нужно:

cols = ['D','E','F','G']
#for each group transpose df and check if all duplicates
df1 = df.groupby('A')[cols].apply(lambda x: x.T.duplicated(keep=False))
#for duplicates aggregate sum else 0
arr = np.where(df1.all(axis=1), df.groupby('A')[cols[0]].sum(), 0)
#remove unnecessary columns and add new, get first rows per column A
df = df.drop(cols, axis=1).drop_duplicates('A').assign(D=arr)
print (df)
        A        B        C  D
0   13348    xyzqr   324580  5
2   45832  gberthh   258729  0
4   58712    bgrtw   984562  2
5   76493     hzrt   638495  0
6  643509        .  T648501  2

Альтернативное решение с проверкой каждой группы, если все значения являются дуплексами:

cols = ['D','E','F','G']
m = df.groupby('A')[cols].apply(lambda x: x.T.duplicated(keep=False).all())
print (m)
A
13348     True
45832    False
dtype: bool

arr = np.where(m, df.groupby('A')[cols[0]].sum(), 0)
df = df.drop(cols, axis=1).drop_duplicates('A').assign(D=arr)
print (df)
        A        B        C  D
0   13348    xyzqr   324580  5
2   45832  gberthh   258729  0
4   58712    bgrtw   984562  2
5   76493     hzrt   638495  0
6  643509        .  T648501  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...