大熊猫的条件分组和转置

时间:2019-02-26 01:02:14

标签: dataframe pandas-groupby

在给定CSV框架外的输入数据帧的情况下,我需要根据特定条件转置数据。分组依据应基于键值应用。

对于同一“键”组中的任何值,如果“类型”为“ T”,则这些值应写在标记为T1,T2,T3等的“ T”列上。

对于同一“键”组中的任何值,如果“类型”为“ P”且“代码”以“ 00”结尾,则这些值应写在标记为U1,U2,U3的“ U”列上。 ..依此类推。

对于同一“键”组中的任何值,如果“类型”为“ P”且“代码”不以“ 00”结尾,则这些值应写在标记为P1,P2的“ P”列上,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 :(得分:0)

以下是使用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