仅从列表推导中打印非空数据帧

时间:2017-01-28 11:53:27

标签: python pandas numpy

目前我有一个数据框列表,我通过列表理解运行。结果是所有具有或不具有行的数据帧都限定了列表推导中的函数。我想只打印出非空的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: []]

编辑: 我需要的是df1仅显示' df1'作为某种标签。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:3)

  • 我同意@MaxU,如果你想要empty的名字,你需要在数据结构中嵌入这个名字。为此,我将使用元组列表。
  • 我将使用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)] 属性过滤列表
{{1}}

答案 2 :(得分:0)

这个怎么样:

编辑:此版本支持手动命名DataFrame或自动枚举。

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]

每列都附加了DataFrame的名称。如果没有手动分配名称,将使用enumaration。