【问题标题】:How to apply function to dataframe in place如何将功能应用于数据框
【发布时间】:2015-04-24 00:53:44
【问题描述】:

有没有办法可以在numpy.array(或pandas.DataFrame)上使用像norm.cdf这样的scipy函数就地,使用numpy.applynumpy.apply_along_axs的变体,等等?


背景是,我有一个 z-score 值表,我想将其转换为规范分布的 CDF 值。我目前正在为此使用来自scipynorm.cdf

我目前正在处理具有非数字值的数据框。

      Name      Val1      Val2      Val3      Val4 
0        A -1.540369 -0.077779  0.979606 -0.667112   
1        B -0.787154  0.048412  0.775444 -0.510904   
2        C -0.477234  0.414388  1.250544 -0.411658   
3        D -1.430851  0.258759  1.247752 -0.883293   
4        E -0.360181  0.485465  1.123589 -0.379157

(将Name 变量设为索引是一种解决方案,但在我的实际数据集中,名称不是字母字符。)

为了只修改数值数据,我使用了df._get_numeric_data() 一个私有函数,它返回一个包含数据帧数值数据的数据帧。但是,没有set 功能。因此,如果我调用

norm.cdf(df._get_numeric_data)

这不会改变df的原始数据。

我试图通过将norm.cdf 应用于数字数据框就地来规避这一点,因此这会改变我的原始数据集。

【问题讨论】:

  • 您可以从_get_numeric_data 的索引中获取数字列,但关键是您必须分配回要覆盖的 df 列,以便您可以执行类似for col in df._get_numeric_data.index: df[col] = norm.cdf(df[col]) 的操作或类似的

标签: python pandas scipy vectorization


【解决方案1】:

我想我更喜欢select_dtypes 而不是_get_numeric_data

In [11]: df.select_dtypes(include=[np.number])
Out[11]:
       Val1      Val2      Val3      Val4
0 -1.540369 -0.077779  0.979606 -0.667112
1 -0.787154  0.048412  0.775444 -0.510904
2 -0.477234  0.414388  1.250544 -0.411658
3 -1.430851  0.258759  1.247752 -0.883293
4 -0.360181  0.485465  1.123589 -0.379157

虽然 apply 不提供 inplace,但您可以执行以下操作(无论如何我认为这更明确):

num_df = df.select_dtypes(include=[np.number])
df[num_df.columns] = norm.cdf(num_df.values)

【讨论】:

  • 你说得对,我认为select_dtypes 是获取数字数据的更合理的方式。我认为@EdChum 的回答也暗示了这个答案。如果有inplace=True 选项就好了。
  • @hlin117 啊,是的,我错过了,按列进行 可能 是更好的选择,因为您可以避免向上转换 dtype(例如从 int 到 float),这取决于。 ..可能很多。 :)
  • @hlin117 我还要说,在 pandas 中,inplace 通常有点虚伪,因为即使传递了一个 inplace 参数,您也可以复制 - tbh/imo 这没什么大不了的,让一切变得更容易推理/更明确。如果你想做就地的东西,用 numpy 做 然后 使用 pandas...
  • 关于 numpy 和就地操作的要点。但我的原始数据集最好作为数据框(因为每一列都有一个列名)。而且我想尽可能减少使用的内存量。
  • @hlin117 如果您对数据进行变异,问题是熊猫副本,您希望这将在原地工作的唯一方法是如果 norm.cdf 就地工作 - 我认为它不会,并且你只传递float或int值并修改它们 - 但是最后一部分工作实际上是一个实现细节(pandas不保证它)。
猜你喜欢
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多