在数据帧列表上应用操作

时间:2017-09-15 14:43:32

标签: python pandas dataframe

从这个问题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

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

3 个答案:

答案 0 :(得分:5)

使用sum计算0以下的项目数,只计算yield个。

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

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

答案 2 :(得分: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')