在Pandas中创build多层次数据透视表

1.背景

我现在使用的.xls文件中包含了多个不同地点的多种污染物参数。

我在下面创build了一个简化的数据框:

在这里输入图像说明

一些声明:

  1. 网站包含监视网站属性。 在这种情况下,站点S1S2是唯一的两个位置。

  2. 时间包含不同站点的监视时间段。

  3. 物种 A和B代表已经检测到两种化学污染物。

  4. 浓度是每个物种的一个关键参数(A&B)代表浓度。 请注意,物种A的浓度应平行测量两次。

  5. PQ是两个不同的分析实验。 由于物种A有两个样本,分别有P1P2P3Q1Q2作为分析结果。 物种B只被P分析。 所以, P1P2P3是唯一的参数。

读了一些关于使用pandas操作pivot_table的post之后,我想尝试一下。

我的目标

我在Excel中手动呈现了我的目标文件结构,如下所示:

在这里输入图像说明

我的工作

df = pd.ExcelFile("./test_file.xls") df = df.parse("Sheet1") pd.pivot_table(df,index = ["Site","Time","Species"]) 

这是结果:

在这里输入图像说明

更新

我想弄清楚的是在它们下面创build两列PQ和sub_columns。

我在这里重新上传我的testing文件。 任何有兴趣的人都可以下载它。

  • PQtesting分别针对物种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