Pandas — Объединение сгруппированного столбца с другим фреймом данных

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

Один из моих фреймов данных содержит столбцы

 WR          K ID
SP-RS-001   K001
SP-RS-001   K002
SP-RS-001   K006
SP-RS-002   K002
SP-RS-002   K007
SP-RS-002   K008
  

а у другого есть [ПРАВИТЬ]

 U Code     CO Code    K ID
C001       C001.01    K001
C001       C001.02    K002
C001       C001.03    K006
C002       C002.01    K001
C002       C002.02    K006
  

Мне нужен другой столбец в этом фрейме данных, который дает

 U Code     K ID               WR
C001       K001, K002, K006   SP-RS-001, SP-RS-002
C002       K001, K006         SP-RS-001
C003       K002, K007         SP-RS-001, SP-RS-002
  

Как я могу это сделать? Спасибо! 🙂

Комментарии:

1. K001, K002, K006 это одна строка или список строк?

2. @suicidalteddy Это объединенная строка, основанная на группировке столбца. Я использовал .groupby('col_name').agg({'K ID' : ', '.join})

3. @harry04 можете ли вы предоставить фрейм данных, из которого он был получен? Было бы проще выполнить слияние и groupby за один шаг

4. @user3483203 внес правку в приведенную выше таблицу. Вот как это выглядело изначально.

Ответ №1:

Прежде всего, я предполагаю, что запись C003 была ошибкой (в вашем первоначальном вопросе), я полагаю, что для вас сработает следующее. Не было очевидно, какой тип слияния вы хотели, поэтому я предположил внутреннее слияние.

Загрузить фрейм данных:

 df1 = pd.DataFrame({'WR': ['SP-RS-001', 'SP-RS-001', 'SP-RS-001', 'SP-RS-002', 'SP-RS-002', 'SP-RS-002'],
                'K_ID': ['K001', 'K002', 'K006', 'K002', 'K007', 'K008']})

df2 = pd.DataFrame({'U_Code': ['C001', 'C001', 'C001', 'C002', 'C002'],
                    'C0_Code': ['C001.01', 'C001.02', 'C001.03', 'C002.01', 'C002.02'],
                    'K_ID': ['K001', 'K002', 'K006', 'K001', 'K006']})
  

Слияние по K_ID:

 df = df2.merge(df1, on='K_ID', how='inner')[['U_Code', 'K_ID', 'WR']]
  

Это дает нам:

введите описание изображения здесь

и, наконец, groupby в U_CODE со следующей агрегирующей функцией:

 def f(x):
    return pd.Series(dict(K_ID = ', '.join(x['K_ID'].unique()), 
                    WR = ', '.join(x['WR'].unique())))

df = df.groupby(['U_Code']).apply(f)
  

Что дает нам:

введите описание изображения здесь

Надеюсь, это поможет.

Комментарии:

1. С некоторыми изменениями в словаре в f(x) у меня это сработало! Спасибо! 🙂

Ответ №2:

Я думаю, вы ищете это:

 df3 = df1.merge(df2, on = 'K ID')

df4 =df3.groupby('U Code')['K ID','WR'].agg({'K ID': lambda x: ','.join(x), 'WR': lambda x: ','.join(x)})