Как объединить значения одного и того же столбца на основе условия? - PullRequest
1 голос
/ 23 апреля 2019

У меня есть таблица, которая выглядит так -

date        name        values      items
01-03-2019  xyz         900         NaN
NaN         NaN         900         brush
02-03-2019  abc        1200         NaN
NaN         NaN         900         paste
NaN         NaN         300         floss

и желаемый результат -

date            name       values        items
01-03-2019      xyz        900           brush
02-03-2019      abc        1200          paste, floss

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

Ответы [ 2 ]

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

Используйте GroupBy.agg с первым столбцом и ffill для прямого заполнения пропущенных значений и словаря, который создается динамически - для каждого столбца без date и items применяется агрегатная функция GroupBy.first и для последнего столбца items используется join с удаленными пропущенными значениями:

d = dict.fromkeys(df.columns.difference(['date','items']), 'first')
d['items'] = lambda x: ', '.join(x.dropna())
df = df.groupby(df['date'].ffill()).agg(d).reset_index()
print (df)
         date name  values         items
0  01-03-2019  xyz     900         brush
1  02-03-2019  abc    1200  paste, floss

Если возможно только несколько столбцов, передайте 2 столбца в groupby с помощью ffill и создайте словарь, переданный в agg:

df = (df.groupby([df['date'].ffill(), df['name'].ffill()])
       .agg({'values':'first', 'items':lambda x: ', '.join(x.dropna())})
       .reset_index())
print (df)
         date name  values         items
0  01-03-2019  xyz     900         brush
1  02-03-2019  abc    1200  paste, floss
0 голосов
/ 23 апреля 2019

Мы можем использовать fillna с forwardfill (ffill).Затем dropna и одновременно groupby с agg, чтобы получить значение sum и объединить строки в элементах:

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

df = df.dropna().groupby('date').agg({'name':'first',
                                      'values':'sum',
                                      'items':', '.join}).reset_index()

print(df)
         date name  values         items
0  01-03-2019  xyz     900         brush
1  02-03-2019  abc    1200  paste, floss

...