我有一个大熊猫数据框,如下所示:
S.No Name1 Name2 Size
1 ABC XYZ 12
2 BCA XCZ 15
3 DAB ZXM 20
如何为Name1列中的所有唯一值创建分层列,后跟名称2中具有所有唯一值的列,这将使数据框如下所示:
ABC BCA DAB
S.NO XYZ XCZ ZXM XYZ XCZ ZXM XYZ XCZ ZXM
1 12 N / A N / A
2 N / A 15 N / A.
3 N / A N / A 20
考虑在辅助数据框上使用merge
填充空行,该数据框是使用itertools.product
从值的唯一笛卡尔积(S.No,Name1,Name2的所有可能组合)创建的:
from io import StringIO
from itertools import product
import pandas as pd
txt = '''S.No Name1 Name2 Size
1 ABC XYZ 12
2 BCA XCZ 15
3 DAB ZXM 20'''
df = pd.read_table(StringIO(txt), sep="\s+")
fill_df = pd.DataFrame(list(product(df['S.No'].unique(), df['Name1'].unique(), df['Name2'].unique())),
columns=['S.No', 'Name1', 'Name2'])
df = df.merge(fill_df, on=['S.No', 'Name1', 'Name2'], how='right')
pvtdf = df.pivot_table(index='S.No', columns=['Name1', 'Name2'],
values='Size', aggfunc='max', dropna=False)\
.rename_axis([None, None], axis="columns")
print(pvtdf)
# ABC BCA DAB
# XCZ XYZ ZXM XCZ XYZ ZXM XCZ XYZ ZXM
# S.No
# 1 NaN 12.0 NaN NaN NaN NaN NaN NaN NaN
# 2 NaN NaN NaN 15.0 NaN NaN NaN NaN NaN
# 3 NaN NaN NaN NaN NaN NaN NaN NaN 20.0
您也可以使用.unstack
来获得所需的多索引格式。
让我们说df
是你的数据框架。做这个:
df = df.set_index(['S.No','Name1','Name2'])['Size'].unstack(level=-2).unstack(level=-1)
df.columns.names = [None, None]
df = df.reindex(columns=['XYZ', 'XCZ', 'ZXM'], level = 1)
df.fillna('', inplace=True) # if you want to replace NAs with blanks
print(df)
ABC BCA DAB
XYZ XCZ ZXM XYZ XCZ ZXM XYZ XCZ ZXM
S.No
1 12
2 15
3 20