Агрегирование строковых столбцов с использованием панд GroupBy - PullRequest
0 голосов
/ 15 мая 2018

У меня есть DF, например:

df =

vid   pos      value       sente
1     a         A           21
2     b         B           21
3     b         A           21
3     a         A           21
1     d         B           22
1     a         C           22
1     a         D           22
2     b         A           22
3     a         A           22

Теперь я хочу объединить все строки с одинаковыми значениями для sente и vid в одну строку со значениями для value, соединенными " "

df2 =

vid   pos      value       sente
1     a         A           21
2     b         B           21
3     b a       A A         21
1     d a a     B C D       22
2     b         A           22
3     a         A           22

Полагаю, модификация этого должна помочь:

df2 = df.groupby["sente"].agg(lambda x: " ".join(x))

Но я не могу понять, как добавить второй столбец к утверждению.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Начиная с этого редактирования, ответ @ cᴏʟᴅsᴘᴇᴇᴅ намного лучше.

Fun Way! Работает только потому, что значения одного символа

df.set_index(['sente', 'vid']).sum(level=[0, 1]).applymap(' '.join).reset_index()


   sente  vid    pos  value
0     21    1      a      A
1     21    2      b      B
2     21    3    b a    A A
3     22    1  d a a  B C D
4     22    2      b      A
5     22    3      a      A

в некоторой степени хорошо отвечает

df.set_index(['sente', 'vid']).groupby(level=[0, 1]).apply(
    lambda d: pd.Series(d.to_dict('l')).str.join(' ')
).reset_index()

   sente  vid    pos  value
0     21    1      a      A
1     21    2      b      B
2     21    3    b a    A A
3     22    1  d a a  B C D
4     22    2      b      A
5     22    3      a      A

не рекомендуется

df.set_index(['sente', 'vid']).add(' ') \
  .sum(level=[0, 1]).applymap(str.strip).reset_index()

   sente  vid    pos  value
0     21    1      a      A
1     21    2      b      B
2     21    3    b a    A A
3     22    1  d a a  B C D
4     22    2      b      A
5     22    3      a      A
0 голосов
/ 15 мая 2018

Группировщики могут быть переданы в виде списков. Кроме того, вы можете немного упростить свое решение, избавившись от лямбда-кода - это не нужно.

df.groupby(['vid', 'sente'], as_index=False, sort=False).agg(' '.join)

   vid  sente    pos  value
0    1     21      a      A
1    2     21      b      B
2    3     21    b a    A A
3    1     22  d a a  B C D
4    2     22      b      A
5    3     22      a      A

Некоторые другие примечания: указание as_index=False означает, что ваши группировки будут присутствовать в виде столбцов в результате (а не в качестве индекса, как по умолчанию). Кроме того, sort=False сохранит исходный порядок столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...