【问题标题】:How to apply a function to a mixed type Pandas DataFrame in place?如何将函数应用于混合类型的 Pandas DataFrame?
【发布时间】:2014-04-17 21:31:51
【问题描述】:

这就是我将函数应用于 Pandas 数据框的方式,它可以在原地工作并修改原始数据框。

df  = pd.DataFrame([[0,0,0],
                    [0,0,0],
                    [0,0,0]],
                    columns=['a', 'b', 'c'])

def add_one(x) :
    x['b'] = x['b'] + 1
    return x

df.apply(add_one, axis=1)

但是,如果我在这个数据帧上尝试相同的操作(它有整数和浮点数,而不仅仅是整数),那么它无法就地应用并总是返回一个数据帧。但我有一个巨大的数据框,所以我想就地做。

df = pd.DataFrame([[0,1.0,0],
                   [0,1.0,0],
                   [0,1.0,0]],
                   columns=['a', 'b', 'c'])

你能帮帮我吗? (以及为什么首先会出现这种行为!)

谢谢。

【问题讨论】:

  • 试试x['b']+=1有关系吗?
  • 你用的是什么版本的pandas,在0.13.1可以用
  • 嗯,你是对的,因为行为不同,对我来说第二个代码示例行为是正确的,因为docs 中没有任何内容表明它应该就地修改
  • @EdChum 我在 0.12.0,将尝试新版本。
  • 查看我的最新评论,0.13.1 也表现出相同的行为,我对文档的解释是它不应该按照您的预期进行修改,所以您应该分配,您可以这样做 df['b'] = df['b'].apply(add_one)我猜这不是你真正在做的事情,而且你的功能比这要复杂一些

标签: python pandas


【解决方案1】:

列中的每个元素都具有相同的 dtype,因此当您从 DataFrame 获取列 Series 时, 他们共享内存。

但是如果你从DataFrame 得到一行Series,它可能不包含相同的dtype 值,在这个 如果您将获得转换为通用 dtype 的数据的副本。

下面的代码,df.apply(f, axis=1) 将每一行传递给包含副本的函数 数据:

df = pd.DataFrame([[0,1.0,0],
                   [0,1.0,0],
                   [0,1.0,0]],
                   columns=['a', 'b', 'c'])

def f(x):
    x.values[0] += 1
    return x

df.apply(f, axis=0) #pass every column to f, this will change the original dataframe
print df

df.apply(f, axis=1) #pass every row to f, this will not change the original dataframe
print df

【讨论】:

  • 我意识到这确实回答了这个问题(很好),但是使用带有副作用的 apply 似乎很笨拙/错误/我真的不喜欢它!
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2019-04-10
  • 2019-08-06
  • 2020-08-11
  • 1970-01-01
  • 2020-07-02
  • 2020-08-06
相关资源
最近更新 更多