Группировка нескольких строк в новом фрейме данных - PullRequest
0 голосов
/ 12 сентября 2018

Я новичок в Python, работающий над версией 2.7. Ниже приведен пример фрейма данных, с которым я работаю. Существуют дополнительные столбцы, которые не имеют отношения к проблеме, поэтому они не включены в приведенный ниже.

df = pd.DataFrame( { "Name" : ["BROD", "BROD", "BROD", "BROD", "SSBD" , "SSBD","SSBD","SSBD"] , 
                     "Digit" : ["F", "F", "T", "T", "F", "F", "T", "T"],
                     "ID": ["A","A","A","A","B","B","B","B"],
                     "Date": ["2/3/2010","2/3/2010","2/3/2010","2/3/2010","3/4/2007","3/4/2007","3/4/2007","3/4/2007"],
                     "Base" : ["CAD","CAD","CAD","CAD","CAD","CAD","CAD","CAD"],
                     "Term" : ["USD","USD","JPY","JPY","EUR","EUR","JPY","JPY"],
                     "Amt": [100.00,100.00,9082.00,9082.00,60.00,60.00,7387.80,7387.80]})

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

ID    Date       Name     Buy   Sell    Buy Amt Sell Amt
A    2/3/2010    BROD     USD   JPY     100.00   9082.00
B    3/4/2007    SSBD     EUR   JPY     60.00    7387.80

Где для каждого идентификатора, если Цифра = F, то значение в столбце Срок помещается в столбец Покупка, а значение в столбце Амт помещается в столбец Покупка Если цифра = T, то значение в столбце Term помещается в столбец Sell, а значение в столбце Amt помещается в столбец Am Sell.

Пожалуйста, укажите мне правильное направление для наиболее эффективного способа решения этой проблемы. Спасибо.

Ответы [ 2 ]

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

Я предполагаю, что дубликаты должны быть отброшены, иначе вам нужно лучше объяснить, как должны обрабатываться идентичные строки:

>>> df2 = df.drop_duplicates().reset_index(drop=True)

Затем мы создаем два фрейма данных, один для 'F' и один для 'T', создаем Buy / Sell и Buy Amt / Sell Amt для каждого и отбрасываем неиспользуемые столбцы:

>>> df_F = df2[df2.Digit == 'F'].assign(**{'Buy': lambda x: x.Term, 'Buy Amt': lambda x: x.Amt})
...                             .drop(['Digit', 'Base', 'Term', 'Amt'], axis=1)
>>> df_T = df2[df2.Digit == 'T'].assign(**{'Sell': lambda x: x.Term, 'Sell Amt': lambda x: x.Amt})
...                             .drop(['Digit', 'Base', 'Term', 'Amt'], axis=1)

Наконец, мы объединяем два кадра данных и переставляем порядок столбцов:

>>> merged = df_F.merge(df_T, on=['ID', 'Name', 'Date'])
>>> merged[['ID', 'Date', 'Name', 'Buy', 'Sell', 'Buy Amt', 'Sell Amt']]
  ID      Date  Name  Buy Sell  Buy Amt  Sell Amt
0  A  2/3/2010  BROD  USD  JPY    100.0    9082.0
1  B  3/4/2007  SSBD  EUR  JPY     60.0    7387.8

Вот и все. Если «ID» должен быть индексом, вы можете использовать merged.set_index('ID')

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

вы можете использовать np.where, а затем groupby

df['Buy'] = np.where((df['Digit'] == 'F'), df['Term'], np.nan)

df['Sell'] = np.where((df['Digit'] == 'T'), df['Term'], np.nan)

df['BuyAmt'] = np.where((df['Digit'] == 'F'), df['Amt'], np.nan)
df['SellAmt'] = np.where((df['Digit'] == 'T'), df['Amt'], np.nan)

df.drop(['Digit','Base','Term','Amt'], axis=1, inplace= True)

df = df.groupby('ID').first()

print(df)
    Name      Date  Buy Sell  BuyAmt  SellAmt
ID                                           
A   BROD  2/3/2010  USD  JPY   100.0   9082.0
B   SSBD  3/4/2007  EUR  JPY    60.0   7387.8

Также, если вам нужна ваша колонка в том порядке, в котором вы разместили ее, вы можете использовать pandas reindex

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