在Pandas中创build多层次数据透视表
1.背景
我现在使用的.xls文件中包含了多个不同地点的多种污染物参数。
我在下面创build了一个简化的数据框:
一些声明:
-
列网站包含监视网站属性。 在这种情况下,站点S1 , S2是唯一的两个位置。
-
列时间包含不同站点的监视时间段。
-
物种 A和B代表已经检测到两种化学污染物。
-
浓度是每个物种的一个关键参数(A&B)代表浓度。 请注意,物种A的浓度应平行测量两次。
-
P和Q是两个不同的分析实验。 由于物种A有两个样本,分别有P1 , P2 , P3和Q1 , Q2作为分析结果。 物种B只被P分析。 所以, P1 , P2 , P3是唯一的参数。
读了一些关于使用pandas操作pivot_table的post之后,我想尝试一下。
我的目标
我在Excel中手动呈现了我的目标文件结构,如下所示:
我的工作
df = pd.ExcelFile("./test_file.xls") df = df.parse("Sheet1") pd.pivot_table(df,index = ["Site","Time","Species"])
这是结果:
更新
我想弄清楚的是在它们下面创build两列P & Q和sub_columns。
我在这里重新上传我的testing文件。 任何有兴趣的人都可以下载它。
- P和Qtesting分别针对物种A的每个样品。
- Conctesting是为他们俩。
任何意见将不胜感激!
IIUC
您需要相同的dataframe,但具有更好的列索引。
要创build第一个级别:
level0 = df.columns.str.extract(r'([^\d]*)', expand=False)
然后将一个多重索引分配给columns属性。
df.columns = pd.MultiIndex.from_arrays([level0, df.columns])
好像:
print df Conc PQ Conc P1 P2 P3 Q1 Q2 Site Time Species S1 20141222 A 0.79 0.02 0.62 1.05 0.01 1.73 20141228 A 0.13 0.01 0.79 0.44 0.01 1.72 20150103 B 0.48 0.03 1.39 0.84 NaN NaN 20150104 A 0.36 0.02 1.13 0.31 0.01 0.94 20150109 A 0.14 0.01 0.64 0.35 0.00 1.00 20150114 B 0.47 0.08 1.16 1.40 NaN NaN 20150115 A 0.62 0.02 0.90 0.95 0.01 2.63 20150116 A 0.71 0.03 1.72 1.71 0.01 2.53 20150121 B 0.61 0.03 0.67 0.87 NaN NaN S2 20141222 A 0.23 0.01 0.66 0.44 0.01 1.49 20141228 A 0.42 0.06 0.99 1.56 0.00 2.18 20150103 B 0.09 0.01 0.56 0.12 NaN NaN 20150104 A 0.18 0.01 0.56 0.36 0.00 0.67 20150109 A 0.50 0.03 0.74 0.71 0.00 1.11 20150114 B 0.64 0.06 1.76 0.92 NaN NaN 20150115 A 0.58 0.05 0.77 0.95 0.01 1.54 20150116 A 0.93 0.04 1.33 0.69 0.00 0.82 20150121 B 0.33 0.09 1.33 0.76 NaN NaN