2015-05-20 5 views
1

У меня есть 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()) 

Таким образом, цикл должен искать t_seg_size между (1) и (1000000), а также генерировать стандартное отклонение. Тем не менее, я получаю следующее сообщение об ошибке:


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

Любая помощь будет принята с благодарностью.

+1

Вы хотите «print (df3 [(df3 [" t_seg_size "]> = x-999999) & (df3 [" t_seg_size "] EdChum

+0

@EdChum большое спасибо за то, что помогли мне снова с моими проблемами. Если у вас есть время, было бы здорово узнать, есть ли какие-либо другие способы решения этой конкретной задачи - то есть, разделение кадра данных в соответствии с определенными диапазонами и генерация статистики. + Я также хочу построить итоговую статистику как график –

ответ

2

Так ошибка в этой строке:

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

происходит потому, что она становится неоднозначной сравнивать скаляр с массивом, потому что, если есть один матч или все, кроме одного матча она должна быть True? Для того, чтобы сделать это правильно нужно использовать операторы побитовое массив &, |~ для andor и not сравнений, так это теперь становится:

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

+0

cool, но я получаю синтаксическую ошибку для 'stats = {'range' = [], 'std' = []}' 'SyntaxError: недействительный синтаксис ' –

+1

Извините, должен быть': 'а не' = ' – EdChum

+0

' .values ​​[0] 'также не нужен – EdChum

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

Вот предложение, используя groupby, которые должны сделать это значительно быстрее:

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

Это даст вам стандартное отклонение для каждого сегмента в DataFrame во фракции времени. Другим преимуществом является то, что вы можете вызвать многие другие функции на grouped после завершения группировки, такие как средняя, ​​медиана и т. Д. Вы можете легко построить результат, вызвав .plot.

Смежные вопросы