【问题标题】:pandas dataframe use clip on a subset of columns熊猫数据框在列子集上使用剪辑
【发布时间】:2018-02-19 16:05:54
【问题描述】:

我仍然对 pandas 数据帧如何处理应用于整个数据帧切片的函数感到非常困惑。这就是我想做的事情..

我有一个数据框(通常会更大,列更多!)

>> df
            one  two  three
0           NaN  0.0  1000
1           NaN  0.0  2000
2  1.262950e+36  NaN  3000
3           NaN  NaN  4000

我想将值 1.262950e+36 裁剪为其他值,例如 1000,这样数据帧中的任何值(第 3 列除外)的值都不会大于 1000。

我的尝试 1

我尝试了以下方法:

df.loc[:, df.columns.tolist()[:-1]].clip(upper=1000, inplace=True)

但它似乎并没有像我们得到的那样工作

>> df 
               one  two  three
7317           NaN  0.0      1
7318           NaN  0.0      2
7319  1.262950e+36  NaN      3
7320           NaN  NaN      4

我的尝试 2

所以我尝试了复制

df.loc[:, df.columns.tolist()[:-1]] copy.deepcopy(df.loc[:, df.columns.tolist()[:-1]].clip(upper=1000))

这行得通,但显然太长且不可读!

有没有更好、更快、更简洁、更pythonic的方式?

编辑:数据类型

列的dtypes是

>> df.dtypes()
one      float64
two      float64
three      int64
dtype: object

【问题讨论】:

  • 我确实在您的第一次尝试中复制了一些非常接近的内容,并且成功了,您的专栏中的dtypes 是什么? (df.dtypes)
  • 我刚刚更新了我的问题!
  • 试试这个:df.loc[:, ['one', 'two']] = df[['one', 'two']].clip(None, 1000)
  • @joaoavf 我刚刚尝试过,它有效!
  • 我认为值得一试:df[df.columns[:-1]].clip(upper=1000)

标签: python pandas dataframe deep-copy


【解决方案1】:

如果你有 numpy,在大多数情况下,使用 np.maximum 比使用 df.clip 更快。

import numpy as np
      
cols = ['one', 'two']:
df[cols] = np.maximum(df[cols], 0)

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多