相关疑难解决方法(0)

如何在Python Pandas中选择两个值之间的DataFrame中的行?

我试图修改一个DataFrame df只包含列中的值closing_price介于99和101之间的行,并尝试使用下面的代码执行此操作.

但是,我得到了错误

ValueError:Series的真值是不明确的.使用a.empty,a.bool(),a.item(),a.any()或a.all()

我想知道是否有办法在不使用循环的情况下执行此操作.

df = df[(99 <= df['closing_price'] <= 101)]
Run Code Online (Sandbox Code Playgroud)

python pandas

79
推荐指数
8
解决办法
8万
查看次数

在一维观测数据中检测异常值的Pythonic方法

对于给定的数据,我想将异常值(由95%confidense级别或95%分位数函数或任何需要的东西定义)设置为nan值.以下是我现在使用的数据和代码.如果有人能够进一步解释我,我会很高兴的.

import numpy as np, matplotlib.pyplot as plt

data = np.random.rand(1000)+5.0

plt.plot(data)
plt.xlabel('observation number')
plt.ylabel('recorded value')
plt.show()
Run Code Online (Sandbox Code Playgroud)

python statistics numpy matplotlib statsmodels

51
推荐指数
4
解决办法
7万
查看次数

如何在Python中使用卡尔曼滤波器来获取位置数据?

[编辑] @Claudio的回答给了我一个关于如何过滤掉异常值的非常好的提示.我确实想开始在我的数据上使用卡尔曼滤波器.所以我改变了下面的示例数据,以便它具有微妙的变化噪声,这不是那么极端(我也看到了很多).如果有其他人可以给我一些关于如何在我的数据上使用PyKalman的方向,这将是很好的.[/编辑]

对于机器人项目,我试图用相机跟踪空中的风筝.我正在使用Python进行编程,并在下面粘贴了一些嘈杂的位置结果(每个项目都包含一个日期时间对象,但为了清晰起见,我将它们留下了).

[           # X     Y 
    {'loc': (399, 293)},
    {'loc': (403, 299)},
    {'loc': (409, 308)},
    {'loc': (416, 315)},
    {'loc': (418, 318)},
    {'loc': (420, 323)},
    {'loc': (429, 326)},  # <== Noise in X
    {'loc': (423, 328)},
    {'loc': (429, 334)},
    {'loc': (431, 337)},
    {'loc': (433, 342)},
    {'loc': (434, 352)},  # <== Noise in Y
    {'loc': (434, 349)},
    {'loc': (433, 350)},
    {'loc': (431, 350)},
    {'loc': (430, 349)},
    {'loc': (428, 347)},
    {'loc': (427, 345)},
    {'loc': (425, 341)},
    {'loc': (429, 338)},  # <== Noise …
Run Code Online (Sandbox Code Playgroud)

python sensor noise kalman-filter pykalman

24
推荐指数
1
解决办法
1万
查看次数

在大型pandas DataFrame中按组移除异常值的更快方法

我有一个相对较大的DataFrame对象(大约一百万行,数百列),我想按组剪切每列中的异常值.通过"按组分组每个列的异常值"我的意思是 - 计算组中每列的5%和95%分位数,并剪切该分位数范围之外的值.

这是我目前正在使用的设置:

def winsorize_series(s):
    q = s.quantile([0.05, 0.95])
    if isinstance(q, pd.Series) and len(q) == 2:
        s[s < q.iloc[0]] = q.iloc[0]
        s[s > q.iloc[1]] = q.iloc[1]
    return s

def winsorize_df(df):
    return df.apply(winsorize_series, axis=0)
Run Code Online (Sandbox Code Playgroud)

然后,通过我的DataFrame调用features和索引DATE,我可以做到

grouped = features.groupby(level='DATE')
result = grouped.apply(winsorize_df)
Run Code Online (Sandbox Code Playgroud)

这是有效的,除了它非常慢,可能是由于嵌套apply调用:每个组一个,然后每个组中的每个列一个.我试图apply通过一次计算所有列的分位数来摆脱第二个,但是试图将每个列的阈值设置为不同的值.有没有更快的方法来完成此过程?

python pandas

13
推荐指数
3
解决办法
2万
查看次数

Pandas:过滤数据帧过于频繁或过于罕见的值

在pandas数据框架上,我知道我可以在一列或多列上进行分组,然后过滤多于/少于给定数字的值.

但我想在数据帧的每一列上都这样做.我想删除过于频繁的值(假设发生的次数少于5%)或过于频繁.例如,考虑一个包含以下列的数据框:city of origin, city of destination, distance, type of transport (air/car/foot), time of day, price-interval.

import pandas as pd
import string
import numpy as np
vals = [(c, np.random.choice(list(string.lowercase), 100, replace=True)) for c in 
    'city of origin', 'city of destination', 'distance, type of transport (air/car/foot)', 'time of day, price-interval']
df = pd.DataFrame(dict(vals))
>> df.head()
    city of destination     city of origin  distance, type of transport (air/car/foot)  time of day, price-interval
0   f   p   a   n
1   k   b …
Run Code Online (Sandbox Code Playgroud)

python filtering selection pandas

11
推荐指数
1
解决办法
3942
查看次数

使用百分位删除Pandas DataFrame中的异常值

我有一个包含40列和许多记录的DataFrame df.

DF:

User_id | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | Col7 |...| Col39
Run Code Online (Sandbox Code Playgroud)

对于除user_id列之外的每个列,我想检查异常值并删除孔记录,如果出现异常值.

对于每行的异常值检测,我决定简单地使用第5和第95百分位数(我知道它不是最好的统计方法):

编码我到目前为止:

P = np.percentile(df.Col1, [5, 95])
new_df = df[(df.Col1 > P[0]) & (df.Col1 < P[1])]
Run Code Online (Sandbox Code Playgroud)

问题:如何在不执行此操作的情况下将此方法应用于所有列(user_id除外)?我的目标是获取没有具有异常值的记录的数据帧.

谢谢!

python outliers pandas

9
推荐指数
3
解决办法
4万
查看次数

使用 pandas 识别统计异常值:分组并将行减少到不同的数据帧中

我试图了解如何识别数据帧组中的统计异常值。我需要按条件对行进行分组,然后将这些组减少为一行,然后在所有减少的行中找到异常值。

df = pd.DataFrame({'X0': {0: 1, 1: 1, 2: 1, 3: 1, 4: 0, 5: 1, 6: 1, 7: 1, 8: 0, 9: 1, 10: 0, 11: 1, 12: 0, 13: 1, 14: 1, 15: 1, 16: 0, 17: 0, 18: 0, 19: 1, 20: 0, 21: 1, 22: 1, 23: 1, 24: 1, 25: 0, 26: 1, 27: 1, 28: 1, 29: 1, 30: 0, 31: 1, 32: 0, 33: 1, 34: 0, 35: 1, 36: 1, 37: 0, …
Run Code Online (Sandbox Code Playgroud)

python group-by outliers pandas

7
推荐指数
1
解决办法
1179
查看次数

如何使用 IQR 从 DataFrame 中删除异常值?

我有很多列的数据框(大约 100 个特征),我想应用四分位法并想从数据框中删除异常值。

我正在使用此链接 stackOverflow

但问题是上述方法的 nan 工作正常,

当我像这样尝试时

Q1 = stepframe.quantile(0.25)
Q3 = stepframe.quantile(0.75)
IQR = Q3 - Q1
((stepframe < (Q1 - 1.5 * IQR)) | (stepframe > (Q3 + 1.5 * IQR))).sum()
Run Code Online (Sandbox Code Playgroud)

它给了我这个

((stepframe < (Q1 - 1.5 * IQR)) | (stepframe > (Q3 + 1.5 * IQR))).sum()
Out[35]: 
Day                      0
Col1                     0
Col2                     0
col3                     0
Col4                     0
Step_Count            1179
dtype: int64
Run Code Online (Sandbox Code Playgroud)

我只是想知道,接下来我要做什么,以便删除数据框中的所有异常值。

如果我使用这个

def remove_outlier(df_in, col_name):
q1 = df_in[col_name].quantile(0.25)
q3 = df_in[col_name].quantile(0.75)
iqr = q3-q1 …
Run Code Online (Sandbox Code Playgroud)

dataframe python-3.x pandas iqr

6
推荐指数
1
解决办法
2万
查看次数

如何一次性检测和删除每列pandas数据帧中的异常值?

我有一个带有六列的大熊猫数据框,我知道每列中都有一些异常值.所以我有这两行代码,它们正在做我想做的事情.但它只从数据帧的一列中删除异常值.那么如果我想从每一列中删除异常值怎么办?

df = pd.DataFrame({'stlines':np.random.normal(size=533)})
df = df[np.abs(df.stlines-df.stlines.mean()) <= (2*df.stlines.std())]
Run Code Online (Sandbox Code Playgroud)

这样做的优雅方式是什么?

python dataframe pandas

6
推荐指数
2
解决办法
3620
查看次数

检查 Pandas 数据框的异常值

传感器图

我对包含 8 个电极的传感器进行了实验。上图是电极输出与时间的关系图。正如您在图中所见,8 个电极之一显然是异常值(可能是由于某些电气故障)。该图是从 Pandas DataFrame 生成的,它基本上有 10 列(1 列表示时间,8 列表示电极,1 列平均 8 个电极)。

统计检测其中一列是异常值的最佳方法是什么?我想象离群值列然后可以从数据框中删除。

谢谢!

python pandas

3
推荐指数
1
解决办法
9231
查看次数

带有异常值的 numpy 最佳拟合线

我有一个数据散点图,大部分拟合一条线,但有一些异常值。我一直在使用 numpy polyfit 将一条线拟合到数据中,但它会拾取异常值并给我错误的行输出:

线拟合误差

是否有一个函数可以为我提供最适合的线,而不是适合所有数据点的线?

重现代码:

from numpy.polynomial.polynomial import polyfit
import numpy as np
from matplotlib import pyplot as plt


y = np.array([72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 31, 31, 32, 32, 32, 32, 32, 39, 33, 33, 40, 41, 41, 41, 42, 42, 42, 42, 42, 43, 44, 44, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 49, 50, 51, 51, 52, 54, 54, 55, 55, 55, …
Run Code Online (Sandbox Code Playgroud)

python numpy

3
推荐指数
1
解决办法
1340
查看次数

删除异常值(+/- 3 std)并用Python/pandas中的np.nan替换

我已经看到了几个解决我的问题的解决方案

link1 link2

但到目前为止他们还没有帮助我成功.

我相信以下解决方案是我需要的,但继续得到一个错误(我没有声誉点评论/问题):链接

(我收到以下错误,但在管理以下命令时我不明白在哪里.copy()或添加" inplace=True" df2=df.groupby('install_site').transform(replace):

SettingWithCopyWarning:尝试在DataFrame的切片副本上设置值.尝试使用.loc[row_indexer,col_indexer] = value替代

请参阅文档中的警告:链接

所以,我试图提出自己的版本,但我一直陷入困境.开始.

我有一个按时间索引的数据框,其中包含站点列(许多不同站点的字符串值)和浮点值.

time_index            site       val
Run Code Online (Sandbox Code Playgroud)

我想通过按站点分组的'val'列,并用NaN(每组)替换任何异常值(与平均值的+/- 3标准偏差).

当我使用以下函数时,我无法用我的True/Falses向量索引数据框:

def replace_outliers_with_nan(df, stdvs):
    dfnew=pd.DataFrame()
    for i, col in enumerate(df.sites.unique()):
        dftmp = pd.DataFrame(df[df.sites==col])
        idx = [np.abs(dftmp-dftmp.mean())<=(stdvs*dftmp.std())] #boolean vector of T/F's
        dftmp[idx==False]=np.nan  #this is where the problem lies, I believe
        dfnew[col] = dftmp
    return dfnew
Run Code Online (Sandbox Code Playgroud)

另外,我担心上面的函数需要花费很长时间才能生成700万行,这就是为什么我希望使用groupby函数选项.

python grouping outliers

2
推荐指数
1
解决办法
8262
查看次数

Pandas 数据框 - 删除异常值

给定一个熊猫数据框,我想根据其中一列排除与异常值(Z 值 = 3)相对应的行。

数据框如下所示:

df.dtypes
_id                   object
_index                object
_score                object
_source.address       object
_source.district      object
_source.price        float64
_source.roomCount    float64
_source.size         float64
_type                 object
sort                  object
priceSquareMeter     float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

对于线路:

dff=df[(np.abs(stats.zscore(df)) < 3).all(axis='_source.price')]
Run Code Online (Sandbox Code Playgroud)

引发以下异常:

-------------------------------------------------------------------------    
TypeError                                 Traceback (most recent call last)
<ipython-input-68-02fb15620e33> in <module>()
----> 1 dff=df[(np.abs(stats.zscore(df)) < 3).all(axis='_source.price')]

/opt/anaconda3/lib/python3.6/site-packages/scipy/stats/stats.py in zscore(a, axis, ddof)
   2239     """
   2240     a = np.asanyarray(a)
-> 2241     mns = a.mean(axis=axis)
   2242     sstd = a.std(axis=axis, ddof=ddof)
   2243     if axis and mns.ndim < a.ndim:

/opt/anaconda3/lib/python3.6/site-packages/numpy/core/_methods.py in …
Run Code Online (Sandbox Code Playgroud)

python scipy pandas

2
推荐指数
1
解决办法
1万
查看次数