объединить два столбца, чтобы исключить дублирование строк - PullRequest
0 голосов
/ 27 сентября 2018

Я сейчас нахожусь в ситуации, когда у меня есть фрейм данных, который выглядит такэто как имя столбца для amt, чтобы потенциально избавиться от нескольких строк с одинаковым идентификатором.Короче, это должно выглядеть примерно так:

          id     CR2017   CR2018   DR2017  DR2018
0          1    94678.0  13508.0  78671.0  13797.0
1          2   111417.0  21479.0  95266.0   1864.0

Мне интересно, возможно ли это?Я уже час играю с reset_index, set_index и pivot_table, но все еще безуспешно. Заранее спасибо, помощь будет признательна

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018
df['tpdt'] = df['tp'].astype(str) + df['dt'].astype(str)
del df['tp']
del df['dt']
df = df.groupby(['id','tpdt'],as_index=False).sum()
df = df.reset_index().pivot(columns='tpdt', index='id', values='amt')

Добавление пояснения.Сначала вы создаете столбец, который объединяет значения в dt и tp.Затем удалите эти отдельные столбцы, если они вам не нужны.Напишите, что вы выполняете групповую обработку по id и tpdt, и она суммирует значения amt для уникальных пар tp и dt.Напишите, что вы можете повернуть его с помощью tpdt, чтобы сделать его заголовком столбца.Вы можете даже изучить функцию unstack для того же.

0 голосов
/ 28 сентября 2018

Один из способов - использовать все в одном с: сводная таблица по умолчанию aggfunc numpy.mean с reset_index и rename_axis

pd.pivot_table(df,index='id', columns = df.tp.astype(str).str.cat(df.dt.astype(str)), values="amt").reset_index(col_level=1).rename_axis(None, axis=1)

Вывод:

    id  CR2017     CR2018    DR2017     DR2018
0   1   94678.0    13508.0   78671.0    13797.0
1   2   111417.0   21479.0   95266.0    1864.0
0 голосов
/ 27 сентября 2018

Используйте set_index с объединенными столбцами и unstack для изменения формы:

df = df.set_index(['id', df['tp'] + df['dt'].astype(str)])['amt'].unstack().reset_index()
print (df)
   id    CR2017   CR2018   DR2017   DR2018
0   1   94678.0  13508.0  78671.0  13797.0
1   2  111417.0  21479.0  95266.0   1864.0

Или создайте новый столбец:

df['new'] = df['tp'] + df['dt'].astype(str)
df = df.set_index(['id', 'new'])['amt'].unstack().rename_axis(None, axis=1).reset_index()
print (df)
   id    CR2017   CR2018   DR2017   DR2018
0   1   94678.0  13508.0  78671.0  13797.0
1   2  111417.0  21479.0  95266.0   1864.0

Но если получить:

ValueError: Индекс содержит повторяющиеся записи, не может изменить форму

, это означает, что есть дублированные id с парами соединений, такими как:

print (df)
   id  tp    dt       amt
0   1  CR  2017   94678.0 <-dupe 1 CR 2017
0   1  CR  2017   10000.0 <-dupe 1 CR 2017
1   1  CR  2018   13508.0
2   1  DR  2017   78671.0
3   1  DR  2018   13797.0
4   2  CR  2017  111417.0
5   2  CR  2018   21479.0
6   2  DR  2017   95266.0
7   2  DR  2018    1864.0

растворы агрегируют - с помощью groupby + функции агрегирования, например mean, sum и unstack:

df = df.groupby(['id', df['tp'] + df['dt'].astype(str)])['amt'].mean().unstack().reset_index()

Или pivot_table по умолчанию aggfunc='mean':

df = df.pivot_table(index='id',columns=df['tp'] + df['dt'].astype(str), values= 'amt').reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...