2017-09-15 45 views
0

从这个问题Select column with only one negative value我正在尝试使用并将解决方案更改为数据框列表并选择合格的解决方案。不能让它工作。在数据框列表中应用操作

在下面的例子中,我想返回'Z'列中只有一个负值或更小的数据帧。

在这种情况下df1。

示例;

N = 5 

np.random.seed(0) 

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

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

      X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784 
---------------- 
      X   Y   Z 
0 -2.477224 2.871710 0.839526 
1 -2.878690 1.794951 -2.139880 
2 1.995719 -0.231124 2.668014 
3 1.668941 1.683175 0.131090 
4 2.220073 -2.290353 -0.512028 

我怎么能做到这一点?提前致谢。

+0

只是为了确保给定list_of_df = [df1,df2]数据框的列表,您只想返回特定列上具有一个或更少负值的数据帧? – bluesummers

+0

是的,那是对的 – Zanshin

+0

那么,对于示例只是返回第一个df? – Divakar

回答

5

使用sumyield来计算0以下的项目数。

def foo(df_list): 
    for df in df_list: 
     if (df['Z'] < 0).sum(0) <= 1: 
      yield df 

df_list = [df1, df2] 
for df in foo(df_list): 
    print(df) 

      X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784 
+1

我想'if(df ['Z'] <0).sum(0)<= 1' !!!!只有4票左! – piRSquared

+0

@piRSquared LOL ...谢谢:D –

+0

还剩4票?这是一个。 – Wen

0

这将做

def func(dataframe_list, on_column): 

    returned_list = [] 
    for df in dataframe_list: 
     if (df[on_column] < 0).sum() <= 1: 
      returned_list.append(df) 

    return returned_list 

在你的情况,请拨打func([df1, df2], on_column='Z')

2

你可以只使用一个条件列表理解:

dfs = [df1, df2] 
>>> [df for df in dfs if df['Z'].lt(0).sum() <= 1] 
[   X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784] 

结果是满足条件的每个数据框的列表。