- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想向我的 DataFrame 添加一个唯一的 id,通过使用我在这里找到的内容,我基本上成功了,Python Class Decorator 。我从这里知道https://github.com/pydata/pandas/issues/2485尚未明确支持添加自定义元数据,但装饰器似乎是一种解决方法。
当我使用 copy 和 groupby.agg 等方法时,我的装饰 DataFrame 返回新的且类似装饰的 DataFrame。如何让“所有”pandas 函数(例如 pd.DataFrame() 或 pd.read_csv)返回经过修饰的 DataFrame,而不是原始的、未修饰的 DataFrame,而无需单独修饰每个 pandas 函数?即,如何让我的装饰 DataFrame 替换库存 DataFrame?
这是我的代码。首先,我有一个增强的 pandas 模块,wrapPandas.py。
from pandas import *
import numpy as np
def addId(cls):
class withId(cls):
def __init__(self, *args, **kargs):
super(withId, self).__init__(*args, **kargs)
self._myId = np.random.randint(0,99999)
return withId
pandas.core.frame.DataFrame = addId(pandas.core.frame.DataFrame)
运行以下代码片段显示,当我使用 .copy() 和 .groupby().agg() 等方法时,我的 DataFrame 返回修饰的 DataFrame。然后,我将通过展示 pd.DataFrame 等 pandas 函数不会返回我的装饰 DataFrame(遗憾的是,但并不奇怪)来跟进。
编辑:根据 Jonathan Eunice 的回复添加了导入语句。
import wrapPandas as pd
d = {
'strCol': ['A', 'B', 'A', 'C', 'B', 'B', 'A', 'C', 'A'],
'intCol': [6,3,8,6,7,3,9,2,6],
}
#create "decorated" DataFrame
dfFoo = pd.core.frame.DataFrame.from_records(d)
print("dfFoo._myId = {}".format(dfFoo._myId))
#new DataFrame with new ._myId
dfBat = dfFoo.copy()
print("dfBat._myId = {}".format(dfBat._myId))
#new binding for old DataFrame, keeps old ._myId
dfRat = dfFoo
print("dfRat._myId = {}".format(dfRat._myId))
#new DataFrame with new ._myId
dfBird = dfFoo.groupby('strCol').agg({'intCol': 'sum'})
print("dfBird._myId = {}".format(dfBird._myId))
#all of these new DataFrames have the same type, "withId"
print("type(dfFoo) = {}".format(type(dfFoo)))
这会产生以下结果。
dfFoo._myId = 66622
dfBat._myId = 22527
dfRat._myId = 66622
dfBird._myId = 97593
type(dfFoo) = <class 'wrapPandas.withId'>
还有令人悲伤的部分。 dfBoo._myId
当然会引发 AttributeError
。
#create "stock" DataFrame
dfBoo = pd.DataFrame(d)
print(type(dfBoo))
#doesn't have a ._myId (I wish it did, though)
print(dfBoo._myId)
最佳答案
将您的猴子补丁修改为:
pd.DataFrame = pandas.core.frame.DataFrame = addId(pandas.core.frame.DataFrame)
即所以你正在“锁定”或“猴子修补”两个不同的名称。考虑到 pandas.core.frame.DataFrame 是 pd.DataFrame
,这种双重分配的需要可能看起来很奇怪。但您实际上并没有修改 DataFrame
类。您正在注入(inject)一个代理类。无论对代理的引用如何,都有效。直接到原始类的那些没有获得代理行为。通过将您可能想要使用的所有名称都指向代理来更改这一点。下面是它看起来更直观的样子:
我假设您的文件中的某处还有一个 import pandas as pd
,但未显示,否则您的 dfBoo
定义将失败,并出现 NameError: name ' pd' 未定义
。
由于这样的原因,猴子修补是危险的。你正在注入(inject)东西......并且不可能知道你是否“捕获了所有引用”或“修补了你需要的所有内容”。我不能保证代码中不会有其他调用来处理比此名称更低级别的结构,重新调整不会生效。但对于显示的代码来说,它是有效的!
更新您后来询问了如何使此功能适用于pd.read_csv
。嗯,这是您可能需要修补的另一个地方。此时,将上面的补丁代码修改为:
pd.DataFrame = pandas.io.parsers.DataFrame = pandas.core.frame.DataFrame = addId(pandas.core.frame.DataFrame)
修补 pandas.io.parsers.DataFrame
中 DataFrame
的定义可以解决 read_csv
的问题。同样的警告也适用:您可能需要追踪更多用途才能完全覆盖。
关于python - 将修饰的 DataFrame 与所有 pandas 函数关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29474644/
假设我有 3 个 DataFrame。其中一个 DataFrame 的列名不在其他两个中。 using DataFrames df1 = DataFrame([['a', 'b', 'c'], [1,
假设我有 3 个 DataFrame。其中一个 DataFrame 的列名不在其他两个中。 using DataFrames df1 = DataFrame([['a', 'b', 'c'], [1,
我有一个 largeDataFrame(多列和数十亿行)和一个 smallDataFrame(单列和 10,000 行)。 只要 largeDataFrame 中的 some_identifier 列
我有一个函数,可以在其中规范化 DataFrame 的前 N 列。我想返回规范化的 DataFrame,但不要管原来的。然而,该函数似乎也会对传递的 DataFrame 进行变异! using D
我想在 Scala 中使用指定架构在 DataFrame 上创建。我尝试过使用 JSON 读取(我的意思是读取空文件),但我认为这不是最佳实践。 最佳答案 假设您想要一个具有以下架构的数据框: roo
我正在尝试从数据框中删除一些列,并且不希望返回修改后的数据框并将其重新分配给旧数据框。相反,我希望该函数只修改数据框。这是我尝试过的,但它似乎并没有做我所除外的事情。我的印象是参数是作为引用传递的,而
我有一个包含大约 60000 个数据的庞大数据集。我会首先使用一些标准对整个数据集进行分组,接下来我要做的是将整个数据集分成标准内的许多小数据集,并自动对每个小数据集运行一个函数以获取参数对于每个小数
我遇到了以下问题,并有一个想法来解决它,但没有成功:我有一个月内每个交易日的 DAX 看涨期权和看跌期权数据。经过转换和一些计算后,我有以下 DataFrame: DaxOpt 。现在的目标是消除没有
我正在尝试做一些我认为应该是单行的事情,但我正在努力把它做好。 我有一个大数据框,我们称之为lg,还有一个小数据框,我们称之为sm。每个数据帧都有一个 start 和一个 end 列,以及多个其他列所
我有一个像这样的系列数据帧的数据帧: state1 state2 state3 ... sym1 sym
我有一个大约有 9k 行和 57 列的数据框,这是“df”。 我需要一个新的数据框:'df_final'- 对于“df”的每一行,我必须将每一行复制“x”次,并将每一行中的日期逐一增加,也就是“x”次
假设有一个 csv 文件如下: # data.csv 0,1,2,3,4 a,3.0,3.0,3.0,3.0,3.0 b,3.0,3.0,3.0,3.0,3.0 c,3.0,3.0,3.0,3.0,3
我只想知道是否有人对以下问题有更优雅的解决方案: 我有两个 Pandas DataFrame: import pandas as pd df1 = pd.DataFrame([[1, 2, 3], [
我有一个 pyspark 数据框,我需要将其转换为 python 字典。 下面的代码是可重现的: from pyspark.sql import Row rdd = sc.parallelize([R
我有一个 DataFrame,我想在 @chain 的帮助下对其进行处理。如何存储中间结果? using DataFrames, Chain df = DataFrame(a = [1,1,2,2,2
我有一个包含 3 列的 DataFrame,名为 :x :y 和 :z,它们是 Float64 类型。 :x 和 "y 在 (0,1) 上是 iid uniform 并且 z 是 x 和 y 的总和。
这个问题在这里已经有了答案: pyspark dataframe filter or include based on list (3 个答案) 关闭 2 年前。 只是想知道是否有任何有效的方法来过
我刚找到这个包FreqTables ,它允许人们轻松地从 DataFrames 构建频率表(我正在使用 DataFrames.jl)。 以下代码行返回一个频率表: df = CSV.read("exa
是否有一种快速的方法可以为 sort 指定自定义订单?/sort!在 Julia DataFrames 上? julia> using DataFrames julia> srand(1); juli
在 Python Pandas 和 R 中,可以轻松去除重复的列 - 只需加载数据、分配列名,然后选择那些不重复的列。 使用 Julia Dataframes 处理此类数据的最佳实践是什么?此处不允许
我是一名优秀的程序员,十分优秀!