2017-06-05 169 views
0

我有一个有很多列的熊猫数据框。 (请参阅下表。)每列均属于组别分类G1-G4。组的映射在数据字典中。如果我想根据分组数据字典过滤熊猫数据框中的列,例如过滤掉所有G3并生成下面生成的表格,那么执行此操作的最有效方法是什么?通过字典过滤熊猫数据帧

enter image description here

谢谢。

回答

2

说数据帧是:

In [7]: df = pd.DataFrame({'T1': [1], 'T2': [2], 'T3': [3], 'T4': [4], 'T5': [5]}) 

In [8]: df 
Out[8]: 
    T1 T2 T3 T4 T5 
0 1 2 3 4 5 

并说过滤字典是:

In [9]: filter_dict = {'T1': 'G1', 'T2': 'G3', 'T3': 'G3', 'T4': 'G1', 'T5': 'G2'} 

您可以选择除了那些属于G3这样所有列:

In [6]: df[[col_name for col_name, group in filter_dict.items() if group != 'G3']] 
Out[6]: 
    T5 T4 T1 
0 5 4 1 
+0

谢谢!这非常优雅,我不认为我能想出来。我仍然面临一个问题,因为它看起来像我得到一个不在DataFrame中的字典值的错误。即如果在Dic中我有一个T100映射到G5但不存在于DataFrame中,代码就会抱怨。无论如何要解决这个问题? – Research100

+0

我刚刚将下面的条件添加到了可能已经工作的IF语句中。我正在验证。 &(col_name in list(df)) – Research100

+0

您可以在df'中执行'col_name - 不需要将其作为列表。 – LateCoder

1

我迟到了派对,但这是另一种方式:

import pandas as pd 
import numpy as np 

filter_dict = {'T1': 'G1', 'T2': 'G3', 'T3': 'G3', 'T4': 'G1', 'T5': 'G2'} 

#some play data 
dta = np.random.rand(10,5) 
rows = pd.date_range('1-Jan-2001', periods=10) 
cols = ['T'+ str(x) for x in range(1,6)] 
df = pd.DataFrame(dta, rows, cols) 

''' 
        T1  T2  T3  T4  T5 
2001-01-01 0.981817 0.590287 0.421105 0.060628 0.007345 
2001-01-02 0.643111 0.813921 0.301809 0.414912 0.116028 
2001-01-03 0.366478 0.582521 0.997483 0.642552 0.662618 
2001-01-04 0.485125 0.062310 0.278239 0.838958 0.174067 
2001-01-05 0.953075 0.612431 0.204880 0.258736 0.551282 
2001-01-06 0.633442 0.852040 0.338404 0.137305 0.114481 
2001-01-07 0.828730 0.477185 0.456451 0.560955 0.713365 
2001-01-08 0.860316 0.809366 0.656306 0.728917 0.383045 
2001-01-09 0.492210 0.639744 0.511768 0.623203 0.495040 
2001-01-10 0.956224 0.188009 0.938048 0.999993 0.556607 
''' 

#convert wide to long cleanup the index and col names 
df1 = df.stack()\ 
     .reset_index()\ 
     .rename(columns={'level_0':'date','level_1':'ticker', 0:'val'})\ 
     .reset_index('date') 

#map ticker to group  
df1['grp'] = df1.ticker.map(filter_dict) 

#select stuff not in group 3 and pivot to wide format 
df1[df1.grp != 'G3'].pivot('date','ticker','val') 

''' 
ticker   T1  T4  T5 
date          
2001-01-01 0.981817 0.060628 0.007345 
2001-01-02 0.643111 0.414912 0.116028 
2001-01-03 0.366478 0.642552 0.662618 
2001-01-04 0.485125 0.838958 0.174067 
2001-01-05 0.953075 0.258736 0.551282 
2001-01-06 0.633442 0.137305 0.114481 
2001-01-07 0.828730 0.560955 0.713365 
2001-01-08 0.860316 0.728917 0.383045 
2001-01-09 0.492210 0.623203 0.495040 
2001-01-10 0.956224 0.999993 0.556607 
''' 
+0

谢谢!我研究了这种方法......我想这相当于R中的融合方法。地图函数非常整齐。我喜欢它!谢谢! – Research100