我有一个数据帧,其中包含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键的浮点数据类型。
我的问题是,有没有办法根据浮点值的列键选择子集,或者我会更好地在这里使用不同的方法?
答案 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