Как объединить строки при сохранении всех строк и иметь одно значение результата на группу - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь сгенерировать уникальное групповое значение для каждого наблюдения, состоящего из содержимого столбца, объединенного вместе, сохраняя при этом все строки в целости.

У меня есть наблюдения, которые можно сгруппировать по определенному столбцу (столбец A ниже). Я хочу создать уникальное значение для каждой группы, состоящее из содержимого каждой строки этой группы, но при этом не затрагивая строки.

Я пробовал предоставленные решения здесь и здесь , но эти решения сводят результаты, оставляя по одной строке на группу, тогда как я хочу сохранить все строки.

import pandas as pd

d = {'A': [1, 2, 3, 3, 4, 5, 5, 6],
     'B': [345, 366, 299, 455, 879, 321, 957, 543]}

df = pd.DataFrame(d)

print(df)

   A    B
0  1  345
1  2  366
2  3  299
3  3  455
4  4  879
5  5  321
6  5  957
7  5  689
8  6  543

df['B'] = df['B'].astype(str)
df['B_concat'] = df.groupby(['A'])['B'].apply('/'.join)

print(df)

   A    B     B_concat
0  1  345          NaN
1  2  366          345
2  3  299          366
3  3  455      299/455
4  4  879          879
5  5  321  321/957/689
6  5  957          543
7  5  689          NaN
8  6  543          NaN

Единицы в одной группе должны иметь одинаковое значение B_concat.

   A    B     B_concat
0  1  345          345
1  2  366          366
2  3  299      299/455
3  3  455      299/455
4  4  879          879
5  5  321  321/957/689
6  5  957  321/957/689
7  5  689  321/957/689
8  6  543          543

1 Ответ

0 голосов
/ 18 января 2019

Используйте GroupBy.transform для возврата Series с тем же размером, что и оригинал DataFrame, поэтому возможно присвоение новому столбцу:

df['B'] = df['B'].astype(str)
df['B_concat'] = df.groupby(['A'])['B'].transform('/'.join)

Однолинейное решение должно быть:

df['B_concat'] = df['B'].astype(str).groupby(df['A']).transform('/'.join)
print (df)
   A    B B_concat
0  1  345      345
1  2  366      366
2  3  299  299/455
3  3  455  299/455
4  4  879      879
5  5  321  321/957
6  5  957  321/957
7  6  543      543

Или:

df['B_concat'] = df.groupby(['A'])['B'].transform(lambda x: '/'.join(x.astype(str)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...