[英]Combining 2 pandas created pivot table
Pivot Table A 数据透视表A
Balance Deployed
Type Environment OS Model
SupplierA Network 1 Win 10 Model 1 1.0 4.0
Model 2 2.0 5.0
Network 2 Win 10 Model 1 3.0 6.0
Win 7 Model 2 NaN 7.0
Pivot Table B 枢轴表B
Balance Deployed
Type Environment OS Model
SupplierA Network 3 Win 10 Model 1 NaN 8.0
Model 2 NaN 9.0
Network 4 Win 10 Model 1 NaN 10.0
Win 7 Model 2 NaN 11.0
Win 7 Model 3 NaN 12.0
Result 结果
N3/4 Bal Bal N3/4 Deployed Deployed
Type Environment OS Model
SupplierA Network 1 Win 10 Model 1 Nan 1.0 8.0 4.0
Model 2 Nan 2.0 9.0 5.0
Network 2 Win 10 Model 1 Nan 3.0 10.0 6.0
Win 7 Model 2 Nan NaN 11.0 7.0
Win 7 Model 3 Nan NaN 12.0 7.0
Network 3 and Network 4 is actually the subset of Network 1 and Network 2 respectively. 网络3和网络4实际上分别是网络1和网络2的子集。
How do I combine the pivot table B result into Pivot table A result using python pandas. 如何使用python pandas将数据透视表B结果合并到数据透视表A结果中。
Sample code: 样例代码:
filter1 = df[(df["Type"]!="")]
table1 = pd.pivot_table(filter1,index=
["Type","Env","OperSys","Model"],columns=
["AssetLifecycleStatus"],values="Serial
Number",aggfunc='count',margins=True,dropna=True)
table1 = table1.reindex(['Network 1','Network 2'], level=1)
table1 = table1.reindex_axis(['Balance','Deployed], axis=1)
table1.index = table1.index.set_names('Environment', level=1)
table1.index = table1.index.set_names('OS', level=2)
Since pivot tables share the same multindex, consider using .join
: 由于数据透视表共享相同的多重指数,请考虑使用
.join
:
mergedf = table1.join(table2, lsuffix='_', rsuffix='')
To demonstrate with random data (seeded to reproduce same values): 为了演示随机数据(似乎可以再现相同的值):
import numpy as np
import pandas as pd
import datetime as dt
import time
LETTERS = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
epoch_time = int(time.time())
dfs = []
for i in range(2):
np.random.seed(1000 + i)
tmp = pd.DataFrame({'ID': [np.random.randint(1,3) for _ in range(50)],
'GROUP': ["".join(np.random.choice(LETTERS[1:5],1)) for _ in range(50)],
'NUM': np.random.randn(50)*100,
'BOOL': [np.random.choice([True,False],1).item(0) for _ in range(50)],
'DATE': [dt.datetime.fromtimestamp(np.random.randint(1407165459,epoch_time)) for _ in range(50)]})
tmp['YEAR'] = tmp['DATE'].dt.year
dfs.append(tmp.pivot_table(index=['GROUP', 'BOOL', 'ID'],
columns='YEAR', values='NUM', aggfunc='sum').fillna(0))
mdf = dfs[0].join(dfs[1], lsuffix='_', rsuffix='')
Outputs 产出
print(dfs[0])
YEAR 2014 2015 2016 2017
GROUP BOOL ID
B False 1 0.000000 -109.692126 -87.286656 0.000000
2 0.000000 -36.775578 0.000000 0.000000
True 1 85.743275 0.000000 41.534745 80.202451
2 0.000000 0.000000 65.034285 0.000000
C False 1 0.000000 -93.696928 139.442275 24.999852
2 0.000000 86.726082 0.000000 0.000000
True 1 29.132019 64.424261 0.000000 108.224081
2 145.431373 -111.116278 0.000000 -185.134785
D False 1 0.000000 113.341723 0.000000 0.000000
2 0.000000 98.740384 137.415560 0.000000
True 1 0.000000 -63.477170 164.748952 0.000000
2 0.000000 -457.161979 0.000000 -8.200619
E False 1 146.204730 104.853072 196.485406 -143.713939
2 269.964586 0.000000 -379.256574 0.000000
True 1 -142.337059 -15.032559 -153.805456 17.793711
2 -74.200575 0.000000 0.000000 -17.805445
print(dfs[1])
YEAR 2014 2015 2016 2017
GROUP BOOL ID
B False 1 0.000000 141.036715 7.471521 0.000000
2 0.000000 150.056514 -95.408040 50.899685
True 1 68.030610 52.015261 31.100536 -228.762932
2 0.000000 51.645003 0.000000 1.253947
C False 1 8.943704 0.000000 0.000000 96.047025
2 0.000000 207.756386 0.000000 94.866648
True 1 0.000000 10.923869 -24.716529 0.000000
2 0.000000 0.000000 -36.847404 9.879019
D False 1 8.454257 91.386381 -89.693662 33.769267
2 0.000000 72.420881 130.951512 85.189272
True 1 116.647215 -73.226222 -65.496555 0.000000
2 0.000000 155.958910 47.444020 -29.872307
E False 1 0.000000 0.000000 -111.854429 -159.037171
2 0.000000 0.000000 2.417443 -75.488531
True 1 -86.983855 0.000000 102.603068 -51.821700
2 0.000000 -65.017149 0.000000 7.690244
print(mdf)
YEAR 2014_ 2015_ 2016_ 2017_ 2014 2015 2016 2017
GROUP BOOL ID
B False 1 0.000000 -109.692126 -87.286656 0.000000 0.000000 141.036715 7.471521 0.000000
2 0.000000 -36.775578 0.000000 0.000000 0.000000 150.056514 -95.408040 50.899685
True 1 85.743275 0.000000 41.534745 80.202451 68.030610 52.015261 31.100536 -228.762932
2 0.000000 0.000000 65.034285 0.000000 0.000000 51.645003 0.000000 1.253947
C False 1 0.000000 -93.696928 139.442275 24.999852 8.943704 0.000000 0.000000 96.047025
2 0.000000 86.726082 0.000000 0.000000 0.000000 207.756386 0.000000 94.866648
True 1 29.132019 64.424261 0.000000 108.224081 0.000000 10.923869 -24.716529 0.000000
2 145.431373 -111.116278 0.000000 -185.134785 0.000000 0.000000 -36.847404 9.879019
D False 1 0.000000 113.341723 0.000000 0.000000 8.454257 91.386381 -89.693662 33.769267
2 0.000000 98.740384 137.415560 0.000000 0.000000 72.420881 130.951512 85.189272
True 1 0.000000 -63.477170 164.748952 0.000000 116.647215 -73.226222 -65.496555 0.000000
2 0.000000 -457.161979 0.000000 -8.200619 0.000000 155.958910 47.444020 -29.872307
E False 1 146.204730 104.853072 196.485406 -143.713939 0.000000 0.000000 -111.854429 -159.037171
2 269.964586 0.000000 -379.256574 0.000000 0.000000 0.000000 2.417443 -75.488531
True 1 -142.337059 -15.032559 -153.805456 17.793711 -86.983855 0.000000 102.603068 -51.821700
2 -74.200575 0.000000 0.000000 -17.805445 0.000000 -65.017149 0.000000 7.690244
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.