【问题标题】:Need to compare one Pandas (Python) dataframe with values from another dataframe需要将一个 Pandas (Python) 数据帧与另一个数据帧的值进行比较
【发布时间】:2017-04-25 03:45:40
【问题描述】:

所以我从 sql 服务器中提取数据,并输入到数据框中。所有数据都是离散形式,并在一个方向(0.0、0.1、0.2...9.8、9.9、10.0)以 0.1 步长增加,每个步长具有多个功率值(例如 1000、1412、134.5、657.1 在0.1), (14.5, 948.1, 343.8 at 5.5) - 希望你明白我想说什么。

我已经设法使用以下方法将数据分组到这些单独的步骤中,然后为每个组取平均值和标准差。

group = df.groupby('step').power.mean() group2 = df.groupby('step').power.std().fillna(0)

这会产生两个数据框(组和组 2),它们具有每个 0.1 步的平均值和标准差。然后很容易使用以下方法为每个步骤创建上限和下限:

upperlimit = group + 3*group2 lowerlimit = group - 3*group2 lowerlimit[lowerlimit<0] = 0

现在让我感到困惑的是!我需要返回原始数据帧并删除功率值超出这些计算限制的行/实例(请注意,每个 0.1 步有不同的上限和下限)。

这是 50 行示例数据:

Index    Power              Step
0        106.0              5.0
1        200.4              5.5
2        201.4              5.6
3        226.9              5.6
4        206.8              5.6
5        177.5              5.3
6        124.0              4.9
7        121.0              4.8
8         93.9              4.7
9        135.6              5.0
10       211.1              5.6
11       265.2              6.0
12       281.4              6.2
13       417.9              6.9
14       546.0              7.4
15       619.9              7.9
16       404.4              7.1
17       241.4              5.8
18        44.3              3.9
19        72.1              4.6
20        21.1              3.3
21         6.3              2.3
22         0.0              0.8
23         0.0              0.9
24         0.0              3.2
25         0.0              4.6
26        33.3              4.2
27        97.7              4.7
28        91.0              4.7
29       105.6              4.8
30        97.4              4.6
31       126.7              5.0
32       134.3              5.0
33       133.4              5.1
34       301.8              6.3
35       298.5              6.3
36       312.1              6.5
37       505.3              7.5
38       491.8              7.3
39       404.6              6.8
40       324.3              6.6
41       347.2              6.7
42       365.3              6.8
43       279.7              6.3
44       351.4              6.8
45       350.1              6.7
46       573.5              7.9
47       490.1              7.5
48       520.4              7.6
49       548.2              7.9

【问题讨论】:

  • 发布您的数据和数据帧的样本。也谷歌 Pandas.DataFrame.Lookup() 函数。
  • 发布groupgroup2 您需要提供尽可能多的有用和相关的信息。

标签: python pandas statistics analysis


【解决方案1】:

换句话说,您希望对分组数据执行一些操作,然后将这些操作的结果投影回未分组的行,以便您可以使用它们来过滤这些行。一种方法是使用transform:

transform 方法返回一个与被分组的对象索引相同(大小相同)的对象。因此,传递的变换函数应该返回一个与组块大小相同的结果。

然后您可以直接创建新行:

df['upper'] = df.groupby('step').power.transform(lambda p: p.mean() + 3*p.std().fillna(0))
df['lower'] = df.groupby('step').power.transform(lambda p: p.mean() - 3*p.std().fillna(0))
df.loc[df['lower'] < 0, 'lower'] = 0

并进行相应的排序:

df = df[(df.power <= df.upper) & (df.power >= df.lower())]

【讨论】:

  • 这太棒了!太感谢了。然而,为了增加一点复杂性——当有一个唯一的“step”值时,这个方法会完全删除数据帧的那一行(在数学上是有意义的)。是否可以保留该唯一行?例如,“步长”中的 5.3 值(幂 = 177.5,索引 = 5)仅出现一次,当然呈现为零的标准偏差,因此创建的上限和下限正好等于 177.5 的幂值.但是出于分析目的,我想保留这一点,因为它是“步骤”的独特价值。谢谢
  • 我的建议是在过滤之前删除要从过滤器中排除的数据,然后在过滤完成后将其重新添加。
猜你喜欢
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多