使用多索引从数据框中选择列的子集

时间:2014-01-10 11:05:34

标签: python pandas

我有一个数据帧,其中包含3个不同深度记录的测量数据通道。

       5     5        5       10     10     10
       x     y        z       x       y     z
1   -22.2    0.9    -88.6   -124.8  -76.7    83.2
2   -94.7   -67.9   -162.6  -200.8  -159.0   2.2
3   -128.7  -99.7   -196.4  -248.5  -219.8  -46.8
4   -127.8  -98.4   -195.1  -256.4  -239.1  -55.7
5   -141.0  -110.9  -208.8  -275.2  -265.7  -76.9
6   -142.1  -111.5  -209.6  -280.7  -276.3  -83.3
7   -147.1  -116.0  -214.6  -287.8  -286.0  -91.6
8   -149.2  -117.8  -216.7  -291.5  -290.9  -96.0

使用X,Y和Z的重复序列(对于3个组件中的每一个)和浮点深度对数据帧进行多索引,如下所示:

c = list(itertools.repeat(['x','y', 'z'], n))
col_a = list(itertools.chain(*c))

col_b = natsorted (depths * 3)

df.columns = [cola, colb]

其中n是深度数,depths是用户定义的浮动列表,描述每个测量的深度(上面示例表中的5和10)。

我希望能够从任何列索引级别创建数据的子集(写入csv或在屏幕上绘图)。选择组件(X,Y或Z)不是问题。

x1 = df['x']
x1.to_csv(x_out.csv')

但是,从特定深度选择所有列不起作用

x1 = df['10']

我尝试了各种表单.ix.loc,但我认为问题可能在于“深度”coumns键的浮点数据类型。

我的问题是,有没有办法根据浮点值的列键选择子集,或者我会更好地在这里使用不同的方法?

2 个答案:

答案 0 :(得分:1)

试试这个:

import numpy as np
import pandas as pd
import itertools

c = list(itertools.repeat(['x','y', 'z'], 3))
col_a = list(itertools.chain(*c))

depths = [5.0, 5.0, 5.0, 10.0, 10.0, 10.0, 20.0, 20.0, 20.0]
names = list("xyzxyzxyz")

df = pd.DataFrame(np.random.rand(8, 9))
df.columns = pd.MultiIndex.from_arrays((depths, names))
print df[10]

输出:

          x         y         z
0  0.767859  0.274721  0.986447
1  0.166864  0.143640  0.896246
2  0.029581  0.951677  0.626415
3  0.822003  0.358323  0.061943
4  0.764663  0.955426  0.831934
5  0.192194  0.001171  0.181386
6  0.649342  0.186907  0.109016
7  0.360859  0.163483  0.597824

选择“x”:

df.xs("x", 1, level=1)

输出:

         5         10        20
0  0.075749  0.767859  0.691237
1  0.305108  0.166864  0.595809
2  0.432526  0.029581  0.317391
3  0.410563  0.822003  0.884315
4  0.865121  0.764663  0.808828
5  0.590033  0.192194  0.657932
6  0.658829  0.649342  0.006082
7  0.677408  0.360859  0.320102

答案 1 :(得分:0)

我同意@ U2EF1。例如,让我们从上面的数据中取出第一行,并根据深度值

将其设为两行
       x     y        z     depth
1   -22.2    0.9    -88.6   5
2   -124.8  -76.7    83.2   10

然后,您可以在pandas中执行大量命令,以根据深度组织数据。

df[df.depth == x] (as U2EF1 suggested)
df.groupby('depth')  # This + unstack() can be great for plotting
df['depth'].value_counts()   # I always use this for sanity checks