Условная группировка в пандах и транспонирование - PullRequest
0 голосов
/ 26 февраля 2019

С входным фреймом данных, созданным из заданного CSV, мне нужно транспонировать данные на основе определенных условий.Группировка должна применяться на основе значения ключа.

Для любого значения в той же группе «Ключ», если «Тип» равен «T», эти значения должны быть записаны в столбцы «T», помеченные как T1, T2, T3 ... и т. Д..

Для любого значения в той же группе «Ключ», если «Тип» равен «P», а «Код» заканчивается на «00», эти значения должны быть записаны в столбцах «U», помеченных как U1,U2, U3 ... и т. Д.

Для любого значения в той же группе «Ключ», если «Тип» равен «P» и «Код» не заканчивается на «00», эти значениядолжно быть написано в столбцах «P», помеченных как P1, P2, P3 ... и т. д.

Может быть n значений типа T & P для любого значения ключа и выходных столбцов для TЗначение & P должно обновляться соответственно

Входной кадр данных:

df = pd.DataFrame({'Key': ['1', '1', '1', '1', '1', '2', '2', '2', '2', '2'],
                   'Value': ['T101', 'T102', 'P101', 'P102', 'P103', 'T201', 'T202', 'P201', 'P202', 'P203'],
                   'Type': ['T', 'T', 'P', 'P', 'P', 'T', 'T', 'P', 'P', 'P'],
                   'Code': ['0', '0', 'ABC00', 'TWY01', 'JTH02', '0', '0', 'OUJ00', 'LKE00', 'WDF45']
                   })

enter image description here

Ожидаемый кадр данных:

enter image description here

Кто-нибудь может предложить эффективное решение для этого случая?

1 Ответ

0 голосов
/ 26 февраля 2019

Вот возможное решение с использованием pivot .

import pandas as pd

df = pd.DataFrame({'Key': ['1', '1', '1', '1', '1', '2', '2', '2', '2', '2'],
                   'Value': ['T101', 'T102', 'P101', 'P102', 'P103', 'T201', 'T202', 'P201', 'P202', 'P203'],
                   'Type': ['T', 'T', 'P', 'P', 'P', 'T', 'T', 'P', 'P', 'P'],
                   'Code': ['0', '0', 'ABC00', 'TWY01', 'JTH02', '0', '0', 'OUJ00', 'LKE00', 'WDF45']
                   })

# Set up the U label
df.loc[(df['Code'].apply(lambda x: x.endswith('00'))) & (df['Type'] == 'P'), 'Type'] = 'U'
# Type indexing by key by type
df = df.join(df.groupby(['Key','Type']).cumcount().rename('Tcount').to_frame() + 1)
df['Type'] = df['Type'] + df['Tcount'].astype('str')
# Pivot the table
pv =df.loc[:,['Key','Type','Value']].pivot(index='Key', columns='Type', values='Value')

>>>pv
Type    P1    P2    T1    T2    U1    U2
Key
1     P102  P103  T101  T102  P101   NaN
2     P203   NaN  T201  T202  P201  P202

cdf = df.loc[df['Code'] != '0', ['Key', 'Code']].groupby('Key')['Code'].apply(lambda x: ','.join(x))

>>>cdf
Key
1    ABC00,TWY01,JTH02
2    OUJ00,LKE00,WDF45
Name: Code, dtype: object

>>>pv.join(cdf)
       P1    P2    T1    T2    U1    U2               Code
Key                                                       
1    P102  P103  T101  T102  P101  None  ABC00,TWY01,JTH02
2    P203  None  T201  T202  P201  P202  OUJ00,LKE00,WDF45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...