【问题标题】:Applying an operation on a list of dataframes对数据框列表应用操作
【发布时间】:2017-09-16 00:04:12
【问题描述】:

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

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

【问题讨论】:

  • 只是为了确保,给定一个数据框列表list_of_df = [df1, df2],您只想返回在特定列上具有一个或更少负值的数据框?
  • 是的,没错
  • 那么,对于示例,只需返回第一个 df?
  • 是的,确实是完整的数据框

标签: python pandas dataframe


【解决方案1】:

使用 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

【讨论】:

  • 是的,真的一样,我用的是一个花哨的列表compr。
  • @divakar;大声笑,刚刚尝试了您的解决方案并想接受它,现在它已经消失了,Alexander 添加了一个类似的
  • @Zanshin 本质上和这个是一样的......这取决于你,但主要的是for df in df_list: if (df['Z'] &lt; 0).sum(0) &lt;= 1:你可以随意旋转。
  • 是的,我知道,不过确实很喜欢单线。我会接受你的,谢谢
  • @Zanshin 关键区别在于 COLDSPEED 在此处使用的生成器与通过推导生成的完整列表。如果您要处理满足条件的数据帧然后丢弃它们,那么生成器方法更可取。如果您只需要它们的集合,那么列表理解通常会更快。
【解决方案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]

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

【讨论】:

    【解决方案3】:

    这样就可以了

    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')

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      相关资源
      最近更新 更多