无法遍历数据框并生成摘要统计信息

Trouble looping over a dataframe and generating summary statistics

我有一个包含变量 (t_seg_size) 的数据框,我想将该变量分成偶数段,例如0-1000000、1000001-2000000 等),然后为每个段生成汇总统计信息。

我使用的方法是以适当大小的块迭代数据帧,然后生成统计信息,例如 .std()。

代码如下:

for x in range (1000000, 200000000, 1000000):
    print(df3[(x-999999 < df3["t_seg_size"] < x)].t_seg_size.std())

所以循环应该在 (1) 和 (1000000) 之间寻找 t_seg_size 并生成标准偏差。但是,我收到以下错误:


ValueError                                Traceback (most recent call last)
<ipython-input-65-ee3e9911be81> in <module>()
      2 #df3[df3["t_seg_size"] > 2000000].describe()
      3 for x in range (1000000, 200000000, 1000000):
----> 4     print(df3[(1000000 < df3["t_seg_size"] < x)].t_seg_size.std())

C:\Users\xxxx\AppData\Local\Continuum\Anaconda3\lib\site-    packages\pandas\core\generic.py in __nonzero__(self)
    696         raise ValueError("The truth value of a {0} is ambiguous. "
    697                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 698                          .format(self.__class__.__name__))
    699 
    700     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如有任何帮助,我们将不胜感激。

所以这一行的错误:

print(df3[(x-999999 < df3["t_seg_size"] < x)].t_seg_size.std())

是因为将标量与数组进行比较变得不明确,因为如果只有一个匹配项或除了一个匹配项之外的所有匹配项应该是 True 怎么办?要正确执行此操作,您需要使用按位数组运算符 &| ~ 进行 and ornot 比较,因此现在变为:

print(df3[(df3["t_seg_size"] >= x-999999) & (df3["t_seg_size"] < x)].t_seg_size.std())

由于运算符的优先级,需要括号。

老实说,我觉得你做的还不错,不确定你想在哪里存储统计数据,但你可以将它添加到列表中,从中创建一个 series/df 并绘制它:

stats={'range':[], 'std':[]}
for x in range (1000000, 200000000, 1000000):
    print(df3[(df3["t_seg_size"] >= x-999999) & (df3["t_seg_size"] < x)].t_seg_size.std())
    stats['range'].append(x)
    stats['std'].append(df3[(df3["t_seg_size"] >= x-999999) & (df3["t_seg_size"] < x)].t_seg_size.std())

你应该可以使用 pd.DataFrame(stats).plot()

绘制它

您的问题看起来与 this one 非常相似。 尝试 numpy.logical_and 它应该可以解决问题。

for x in range (1000000, 200000000, 1000000):
    print(df3[logical_and(df3["t_seg_size"] > x-999999, df3["t_seg_size"] < x)].t_seg_size.std())

这里有一个使用 groupby 的建议,应该会大大加快速度:

 grouped = df.groupby((df.t_seg_size / 1000000).round())
 grouped.t_seg_size.std()

这将在很短的时间内为您提供 DataFrame 中每个段的标准偏差。另一个优点是,一旦分组完成,您可以在 grouped 上调用许多其他函数,例如均值、中位数等。 您可以轻松地在结果上调用 .plot 绘制结果。