условно объединить содержимое ячеек в столбце - PullRequest
2 голосов
/ 22 апреля 2019

В поисках панданистического способа превратить следующее df:

    name    desc
0   A       a
1   NaN     aa
2   NaN     aaa
3   B       b
4   NaN     bb

в

    name    desc
0   A       a
            aa
            aaa
3   B       b
            bb

# strings in desc are concat-ed together with end of line char

Я думаю об общих направлениях itertuple или backfill + groupby, но оба эти подхода требуют некоторой манипуляции.

вот отправная точка:

import pandas as pd
import numpy as np
nan = np.nan

df = pd.DataFrame(
    {'name': ['A', nan, nan, 'B', nan],
    'desc': ['a', 'aa', 'aaa', 'b', 'bb']}
)

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Вы можете позвонить ffill напрямую и agg без использования apply и lambda

In [719]: df.ffill().groupby('name').agg('\n'.join).reset_index()
Out[719]:
  name        desc
0    A  a\naa\naaa
1    B       b\nbb

или:

In [729]: df.ffill().groupby('name', as_index=False).agg({'desc': '\n'.join})
Out[729]:
  name        desc
0    A  a\naa\naaa
1    B       b\nbb
2 голосов
/ 22 апреля 2019

Я думаю, вы хотите комбинацию fillna(method='ffill') и groupby.

Как это выглядит?

import pandas as pd
import numpy as np
nan = np.nan

df = pd.DataFrame(
    {'name': ['A', nan, nan, 'B', nan],
    'desc': ['a', 'aa', 'aaa', 'b', 'bb']}
)

df['name'] = df['name'].fillna(method='ffill')

df = df.groupby('name')['desc'].apply(lambda d: '\n'.join(d)).reset_index()
print df

печать

  name        desc
0    A  a\naa\naaa
1    B       b\nbb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...