【问题标题】:Iterating over rows of dataframe but keep each row as a dataframe迭代数据框的行,但将每一行保留为数据框
【发布时间】:2017-09-19 21:19:40
【问题描述】:

我想遍历数据框的行,但将每一行保留为具有与父数据框完全相同格式的数据框,除了只有一行。我知道调用 DataFrame() 并传入索引和列,但由于某种原因,这并不总是给我与父数据帧相同的格式。在系列(即行)上调用 to_frame() 确实将其转换回数据帧,但通常转置或以某种方式不同于父数据帧格式。难道没有一些简单的方法可以做到这一点并保证每一行的格式总是相同的吗?

这是迄今为止我想出的最佳解决方案:

    def transact(self, orders):
    # Buy or Sell
    if len(orders) > 1:
        empty_order = orders.iloc[0:0]
        for index, order in orders.iterrows():
            empty_order.loc[index] = order
            #empty_order.append(order)
            self.sub_transact(empty_order)
    else:
        self.sub_transact(orders)

本质上,我清空了数据框,然后从 For 循环中将系列插入回其中。这可以正常工作,但会发出以下警告:

C:\Users\BNielson\Google Drive\My Files\machine-learning\Python-Machine-Learning\ML4T_Ex2_1.py:57: SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值 请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy empty_order.loc[index] = 订单 C:\Users\BNielson\Anaconda3\envs\PythonMachineLearning\lib\site-packages\pandas\core\indexing.py:477: SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_indexer,col_indexer] = value 请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self.obj[项目] = s

所以这行给出警告:

empty_order.loc[index] = order

这特别奇怪,因为我 am 已经在使用 .loc,而通常当您不使用 .loc 时会出现此错误。

【问题讨论】:

  • 您能否提供一些与您的问题相同的数据和代码?
  • 是的,我添加了我想出的实际有效的代码。事实是这是相当上下文的,所以有点难以解释。底线是我希望数据框的每一行都具有完全相同的索引(尽管仅针对一行)和列。这样我的代码就不必询问我是否有系列或数据框,并且它们的工作方式不同,具体取决于我所拥有的。
  • 收到该警告特别令人沮丧,尤其是当文档建议您仅在不使用 .loc (我正在使用)时才收到它。它希望我在这里在语法上使用什么?

标签: python-3.x pandas


【解决方案1】:

有一种更简单的方法可以做我想做的事。

order.to_frame().T

所以...

        if len(orders) > 1:
        for index, order in orders.iterrows():
            self.sub_transact(order.to_frame().T) 
    else:
        self.sub_transact(orders)

这实际上是将系列(仍包含必要的列和索引信息)转换回数据帧。但是出于某些 Moronic(但我确信 Pythonic)的原因,它转置了它,以便前一行现在是列,而前一列现在是多行!因此,您只需将其转回即可。

【讨论】:

    【解决方案2】:

    使用带有唯一列表的groupbygroupby 完全符合您的要求,它遍历每个组,每个组都是一个数据框。因此,如果您对它进行操作,以便 groupby 为每一行提供一个唯一的值,那么当您遍历 group 时,您将获得一个单行数据框

    for n, group in df.groupby(np.arange(len(df))):
        pass
        # do stuff
    

    【讨论】:

      【解决方案3】:

      如果我可以建议一种替代方法,那就是这样:

      for index, order in orders.iterrows():
          orders.loc[index:index]
      

      orders.loc[index:index] 恰好是一个具有相同结构的行数据帧切片,包括索引和列名。

      【讨论】:

        猜你喜欢
        • 2017-06-15
        • 1970-01-01
        • 2021-12-09
        • 2019-04-05
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2014-11-25
        • 2017-01-26
        相关资源
        最近更新 更多