麻烦循环数据帧并生成摘要统计信息

时间:2015-05-20 10:20:26

标签: python for-loop pandas range dataframe

我有一个包含变量(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().

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

这一行中的错误:

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())

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

老实说你正在做什么看起来对我很好,不知道你想要存储统计数据的位置,但你可以将它添加到列表中,从中创建一个系列/ 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()

进行绘制

答案 1 :(得分:0)

您的问题看起来与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())

答案 2 :(得分:0)

这里有一个使用groupby的建议,应该会让它快得多:

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

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