目前我有一个数据框列表,我通过列表理解运行。结果是所有具有或不具有行的数据帧都限定了列表推导中的函数。我想只打印出非空的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'作为某种标签。
答案 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)
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。