【问题标题】:Extracting groups of 3 columns from dataframe based on partial names根据部分名称从数据框中提取 3 列组
【发布时间】:2018-01-03 01:38:42
【问题描述】:

我有一个数据帧,其中包含 xyz 中的标记位置,用于 24 个标记,在 10 秒 (100Hz) 时间序列的每一帧中。像这样:

    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)的位置的列提取到新的数据帧,并最好为新数据帧提供标记的名称(即 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? 看起来很有希望,但我需要结果是一个数据框。 我尝试过使用循环和分组,但我似乎无法找到一种正常工作的方法。

【问题讨论】:

  • 为读者提供一个完全可重复的示例将最大限度地提高您获得答案的机会。例如。 import pandas 并提供允许我们直接使用数据帧 (df) 的代码,而不是强制我们从您的 df 的复制粘贴字符串版本开始。
  • 对不起,我不知道怎么做你的建议,第一次发布问题。我很乐意提供 df :)
  • 没问题。下次记住这一点。顺便说一句,jezrael 的答案很可能就是你想要的。请could you remove your signature ? Your "Cheers, Elise"

标签: python pandas dataframe


【解决方案1】:

我认为您需要先通过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创建dictionary of DataFrames

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

【讨论】:

  • 谢谢,这很好用。现在:开始学习字典...
  • 很高兴能帮上忙,dfs['LHEE']df 相同,所以相同的功能和方法可以完美运行。美好的一天!
  • 这很聪明! ++ :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多