2017-01-28 8 views
2

現在、私はリスト内包するデータフレームのリストを持っています。その結果、リストの理解に関数を修飾する行があるかどうかにかかわらず、すべてのデータフレームになります。私は、空ではないdfを印刷したいだけです。それはすべて可能ですか?さらに、データフレームの名前も印刷することは可能でしょうか?リスト内包のみから空でないデータフレームを印刷

例:

N = 5 

np.random.seed(0) 

df1 = pd.DataFrame(
    {'X':np.random.uniform(0,5,N), 
    'Y':np.random.uniform(0,5,N), 
    'Z':np.random.uniform(0,5,N), 
    }) 

df2 = pd.DataFrame(
    {'X':np.random.uniform(-5,0,N), 
    'Y':np.random.uniform(-5,0,N), 
    'Z':np.random.uniform(-5,0,N), 
    }) 

def func_sel(df): 
    return df[df['X'] > 0] 

dfs_list = [df1, df2] 

dfs_sel = [func_sel(x) for x in dfs_list] 

dfs_sel 

Out[14]: 
[   X   Y   Z 
0 2.744068 3.229471 3.958625 
1 3.575947 2.187936 2.644475 
2 3.013817 4.458865 2.840223 
3 2.724416 4.818314 4.627983 
4 2.118274 1.917208 0.355180, Empty DataFrame 
Columns: [X, Y, Z] 
Index: []] 

EDIT: 私はここに必要なものは、ある種のラベルとして 'DF1' で示さDF1です。

+0

にフィルタリングするempty属性を使用します[func_sel(x)はdfs_listにおけるxのlenの場合(X)]'? – MaxU

+0

私は編集を入れました。 – Zanshin

答えて

3
  • 私はあなたdf秒の名前をしたい場合、あなたはデータ構造に名前を埋め込む必要がある、@MaxUに同意します。この目的のためにタプルのリストを使用します。
  • は、私はあなたが `dfs_sel =の後にあるリスト

dfs_list = [('df1', df1), ('df2', df2)] 
dfs_sel = [ 
    (n, df) for n, df in [(n, func_sel(x)) for n, x in dfs_list] if not df.empty] 

dfs_sel 

[('df1',   X   Y   Z 
    0 2.744068 3.229471 3.958625 
    1 3.575947 2.187936 2.644475 
    2 3.013817 4.458865 2.840223 
    3 2.724416 4.818314 4.627983 
    4 2.118274 1.917208 0.355180)] 
0

これはどう:

EDIT:このバージョンでは、手動で命名データフレームまたは自動列挙の両方をサポートしています。

import pandas as pd 
import numpy as np 

N = 5 

np.random.seed(0) 

df1 = pd.DataFrame(
    {'X':np.random.uniform(0,5,N), 
    'Y':np.random.uniform(0,5,N), 
    'Z':np.random.uniform(0,5,N), 
    }) 


df2 = pd.DataFrame(
    {'X':np.random.uniform(-5,0,N), 
    'Y':np.random.uniform(-5,0,N), 
    'Z':np.random.uniform(-5,0,N), 
    }) 

# OPTIONAL: manually assign names 
df1.name = 'df1' 
df2.name = 'df2' 

def func_sel(df, name=None): 
    rdf = df[df['X'] > 0] 
    try: 
     rdf.name = df.name 
    except: 
     rdf.name = name 
    rdf.columns = ['%s %s' % (rdf.name or '', c) for c in rdf.columns] 
    return rdf 

dfs_list = [df1, df2] 

dfs_sel = [func_sel(df, 'df%d' % (x+1)) for x, df in enumerate(dfs_list) if not func_sel(df).empty] 

dfs_sel 

dfs_sel出力:

[  df1 X  df1 Y  df1 Z 
0 2.744068 3.229471 3.958625 
1 3.575947 2.187936 2.644475 
2 3.013817 4.458865 2.840223 
3 2.724416 4.818314 4.627983 
4 2.118274 1.917208 0.355180] 

各列は、添付のデータフレームの名前を有しています。名前を手動で割り当てない場合は、列挙が使用されます。

+0

しかし、 'func_sel'関数に渡す前にDataFrame上で操作を実行すると、pandas.DataFrameオブジェクトはこの' name'属性などの任意のメタデータ属性を保持しません。 [ここ](http://stackoverflow.com/a/14688398)を参照してください。 – u55

+0

これは、提供されている例では機能しますが、注意してください。たぶん、名前が他の場所に保存されるか、DataFrameでさらに操作を実行する必要がある場合、OPのニーズに応じて 'func_sel'に提供する必要があります。 – AArias

+0

@AArias、ありがとう。 1つの問題だが、私はこの名前属性を私が持っているすべてのdfに追加しなければならないだろう。私はこれを手動で行う必要があると思いますか? – Zanshin

3

この場合、リストの代わりに辞書を使用します。

デモ:

In [110]: dfs_dict = {'df1':df1, 'df2':df2} 

In [111]: dfs_sel = {name:func_sel(df) for name, df in dfs_dict.items()} 

In [112]: dfs_sel 
Out[112]: 
{'df1':   X   Y   Z 
0 2.744068 3.229471 3.958625 
1 3.575947 2.187936 2.644475 
2 3.013817 4.458865 2.840223 
3 2.724416 4.818314 4.627983 
4 2.118274 1.917208 0.355180, 'df2': Empty DataFrame 
Columns: [X, Y, Z] 
Index: []} 

In [113]: [df if len(df) else name for name, df in dfs_sel.items()] 
Out[113]: 
['df2',   X   Y   Z 
0 2.744068 3.229471 3.958625 
1 3.575947 2.187936 2.644475 
2 3.013817 4.458865 2.840223 
3 2.724416 4.818314 4.627983 
4 2.118274 1.917208 0.355180]