2017-07-27 87 views
1

我有一个数据框包含xyz中的标记位置,24个标记,在10秒(100Hz)时间序列的每个帧中。就像这样:基于部分名称从数据框中提取3列组

LHEE_x LHEE_y LHEE_z LTOE_x LTOE_y LTOE_z RHEE_x RHEE_y 
0 -347.013 526.914 27.256 -138.267 578.015 39.859 -352.402 297.541 
1 -347.035 526.934 27.261 -138.271 578.074 39.874 -352.409 297.548 
2 -347.041 526.933 27.265 -138.260 578.073 39.898 -352.402 297.533 
3 -347.030 526.928 27.251 -138.242 578.079 39.905 -352.427 297.535 
4 -347.029 526.939 27.222 -138.244 578.072 39.915 -352.445 297.525 
..... 

我想提取包含在时间(即LHEE_x,LHEE_y和LHEE_z)新dataframes从一个标记位置列,preferrably给新dataframes标记的名称(即LHEE )。

我知道我可以通过

LHEE=pos_xyz.iloc[:,0:3] 
or  
LHEE=pos_xyz['LHEE_x','LHEE_y','LHEE_z'] 

这种“手动”做的,但因为我有一吨的标记,这将是一个麻烦..

而且我希望做,做了功能这样我就可以在包含来自不同标记的标记位置的数据框上使用它。

什么是最有效的方法来做到这一点? 这个问题 How to select DataFrame columns based on partial matching? 看起来很有希望,但我需要的结果是一个数据框。 我试过使用循环和分组,但我似乎无法找到正常工作的方式。

+1

为读者提供一个完全重复的例子,将最大限度地提高你的机会,得到答案。例如。 'import pandas'并提供一个代码,它允许我们直接使用数据框(df),而不是让我们从你的df的复制粘贴字符串版本开始。 – Kanak

+0

对不起,我不知道如何做你的建议,第一次发布一个问题。我很乐意提供df :) –

+0

没问题。请记住下次。顺便说一句,jezrael的答案很可能是你想要的。请,[你可以删除你的签名?你的“干杯,Elise”](https://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts)。 – Kanak

回答

2

我想你需要先通过split列名创建Multiindex

df.columns = df.columns.str.split('_', expand=True) 
print (df) 
     LHEE      LTOE      RHEE   
     x  y  z  x  y  z  x  y 
0 -347.013 526.914 27.256 -138.267 578.015 39.859 -352.402 297.541 
1 -347.035 526.934 27.261 -138.271 578.074 39.874 -352.409 297.548 
2 -347.041 526.933 27.265 -138.260 578.073 39.898 -352.402 297.533 
3 -347.030 526.928 27.251 -138.242 578.079 39.905 -352.427 297.535 
4 -347.029 526.939 27.222 -138.244 578.072 39.915 -352.445 297.525 

然后通过dict comprehension创建DataFramesdictionary

dfs = {x:df[x] for x in df.columns.levels[0]} 
print (dfs) 
{'RHEE':   x  y 
0 -352.402 297.541 
1 -352.409 297.548 
2 -352.402 297.533 
3 -352.427 297.535 
4 -352.445 297.525, 'LTOE':   x  y  z 
0 -138.267 578.015 39.859 
1 -138.271 578.074 39.874 
2 -138.260 578.073 39.898 
3 -138.242 578.079 39.905 
4 -138.244 578.072 39.915, 'LHEE':   x  y  z 
0 -347.013 526.914 27.256 
1 -347.035 526.934 27.261 
2 -347.041 526.933 27.265 
3 -347.030 526.928 27.251 
4 -347.029 526.939 27.222} 

print (dfs['LHEE']) 
     x  y  z 
0 -347.013 526.914 27.256 
1 -347.035 526.934 27.261 
2 -347.041 526.933 27.265 
3 -347.030 526.928 27.251 
4 -347.029 526.939 27.222 
+0

谢谢,这工作完美。现在:开始学习字典... –

+0

很高兴能够提供帮助,'dfs ['LHEE']'与'df'相同,所以相同的功能和方法可以完美地工作。 – jezrael

+1

这很聪明! ++ :) – MaxU