首页 > 解决方案 > 处理附加到数据帧的抽象

问题描述

如果我对数据框有“引用”,则似乎无法在 pandas 中附加它,因为 append 和 concat 都不支持该inplace=True参数。

一个(过于)简单的例子:

chosen_df, chosen_row = (candidate_a_df, candidate_a_row) if some_test else (candidate_b_df, candidate_b_row)
chosen_df = chosen_df.append(chosen_row)

现在因为 Python 做了类似于按值复制引用的操作,所以chosen_df最初将是对通过的任何候选数据帧的引用some_test

但是 pandas 的更新语义意味着引用的数据帧不会被 append 函数的结果更新;而是创建一个新标签。我相信,如果有可能使用inplace=True它会起作用,但看起来不太可能发生,在这里讨论https://github.com/pandas-dev/pandas/issues/14796

值得注意的是,使用列表而不是数据框的更简单示例确实有效,因为列表的内容直接由append().

所以我的问题是——如何在 Python 中实现对 N 个数据帧的可更新抽象?

这个成语在允许引用的语言中是司空见惯的、有用的和微不足道的,所以我猜我错过了一个 Pythonic 技巧,或者在考虑戴错帽子的整个问题!

显然,纯粹的说明性示例可以通过在 a 的主体中复制附加内容if...else并依次具体引用每个底层数据帧来解决。但这不能扩展到更复杂的示例,并且它是类似于我正在寻找的参考的通用解决方案。

有任何想法吗?

标签: pythonpython-3.xpandasdataframereference

解决方案


有一种专门针对熊猫数据框的简单方法 - 所以我会回答我自己的问题。

chosen_df, chosen_row = (candidate_a_df, candidate_a_row) if some_test else (candidate_b_df, candidate_b_row)
chosen_df.loc[max_idx+1] = chosen_row

的计算max_idx很大程度上取决于 的结构chosen_df。在最简单的情况下,当它是一个顺序索引从 0 开始的数据帧时,您可以简单地使用索引的长度来计算它。

如果chosen_df是非顺序的,则需要调用max()索引列而不是依赖索引的长度。

如果chosen_df是 slice 或 groupby 对象,那么您需要计算最大父数据帧的索引,以确保它确实是所有行的最大值。


推荐阅读