Чтение файлов csv с фильтром [duplicate]

jQuery Uploadify - еще один хороший плагин, который я раньше использовал для загрузки файлов. Код JavaScript прост, как показано ниже: code. Тем не менее, новая версия не работает в Internet & nbsp; Explorer.

$('#file_upload').uploadify({
    'swf': '/public/js/uploadify.swf',
    'uploader': '/Upload.ashx?formGuid=' + $('#formGuid').val(),
    'cancelImg': '/public/images/uploadify-cancel.png',
    'multi': true,
    'onQueueComplete': function (queueData) {
        // ...
    },
    'onUploadStart': function (file) {
        // ...
    }
});

Я много искал, и я пришел к другому решению для загрузки файлов без какого-либо плагина и только с ajax. Решение таково:

$(document).ready(function () {
    $('#btn_Upload').live('click', AjaxFileUpload);
});

function AjaxFileUpload() {
    var fileInput = document.getElementById("#Uploader");
    var file = fileInput.files[0];
    var fd = new FormData();
    fd.append("files", file);
    var xhr = new XMLHttpRequest();
    xhr.open("POST", 'Uploader.ashx');
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
             alert('success');
        }
        else if (uploadResult == 'success')
            alert('error');
    };
    xhr.send(fd);
}

69
задан durden2.0 28 November 2012 в 19:34
поделиться

5 ответов

Pandas (и numpy) позволяют булевое индексирование , что будет намного более эффективным:

In [11]: df.loc[df['col1'] >= 1, 'col1']
Out[11]: 
1    1
2    2
Name: col1

In [12]: df[df['col1'] >= 1]
Out[12]: 
   col1  col2
1     1    11
2     2    12

In [13]: df[(df['col1'] >= 1) & (df['col1'] <=1 )]
Out[13]: 
   col1  col2
1     1    11

Если вы хотите написать вспомогательные функции для этого, рассмотрите что-то эти строки:

In [14]: def b(x, col, op, n): 
             return op(x[col],n)

In [15]: def f(x, *b):
             return x[(np.logical_and(*b))]

In [16]: b1 = b(df, 'col1', ge, 1)

In [17]: b2 = b(df, 'col1', le, 1)

In [18]: f(df, b1, b2)
Out[18]: 
   col1  col2
1     1    11

Обновление: pandas 0.13 имеет метод запроса для этих видов использования, предполагая, что имена столбцов являются действительными идентификаторами, следующие работы (и могут быть более эффективными для больших кадров, поскольку он использует numexpr за кулисами):

In [21]: df.query('col1 <= 1 & 1 <= col1')
Out[21]:
   col1  col2
1     1    11
127
ответ дан Andy Hayden 24 August 2018 в 03:41
поделиться

Условия цепочек создают длинные строки, которые не рекомендуется pep8. Использование метода .query вынуждает использовать строки, которые являются мощными, но непитоническими и не очень динамичными.

Как только каждый из фильтров находится на месте, один из подходов -

import numpy as np
import functools
def conjunction(*conditions):
    return functools.reduce(np.logical_and, conditions)

c_1 = data.col1 == True
c_2 = data.col2 < 64
c_3 = data.col3 != 4

data_filtered = data[conjunction(c1,c2,c3)]

np.logical работает и работает быстро, но не принимает более двух аргументов, которые обрабатываются по functools.reduce.

Обратите внимание, что это все еще имеет некоторые избыточности: a) краткое сокращение не происходит на глобальном уровне b) Каждое из отдельных условий выполняется на всех исходных данных. Тем не менее, я ожидаю, что это будет достаточно эффективно для многих приложений, и это очень читаемо.

12
ответ дан Gecko 24 August 2018 в 03:41
поделиться

Самый простой из всех решений:

Использование:

filtered_df = df[(df['col1'] >= 1) & (df['col1'] <= 5)]

Другой пример. Чтобы отфильтровать фрейм данных для значений, принадлежащих Feb-2018, используйте приведенный ниже код

filtered_df = df[(df['year'] == 2018) & (df['month'] == 2)]
4
ответ дан Gil Baggio 24 August 2018 в 03:41
поделиться

Почему бы не сделать это?

def filt_spec(df, col, val, op):
    import operator
    ops = {'eq': operator.eq, 'neq': operator.ne, 'gt': operator.gt, 'ge': operator.ge, 'lt': operator.lt, 'le': operator.le}
    return df[ops[op](df[col], val)]
pandas.DataFrame.filt_spec = filt_spec

Демонстрация:

df = pd.DataFrame({'a': [1,2,3,4,5], 'b':[5,4,3,2,1]})
df.filt_spec('a', 2, 'ge')

Результат:

   a  b
 1  2  4
 2  3  3
 3  4  2
 4  5  1

Вы можете видеть, что столбец 'a' был отфильтрован, где a> = 2.

Это немного быстрее (время ввода, а не производительность), чем цепочка операторов. Конечно, вы могли бы поставить импорт в верхнюю часть файла.

0
ответ дан Obol 24 August 2018 в 03:41
поделиться

Так как pandas 0.22 update доступны варианты сравнения:

  • gt (больше)
  • lt (меньше)
  • eq (равно)
  • ne (не равно)
  • ge (больше или равно)

и многое другое. Эти функции возвращают логический массив. Посмотрим, как мы можем их использовать:

# sample data
df = pd.DataFrame({'col1': [0, 1, 2,3,4,5], 'col2': [10, 11, 12,13,14,15]})

# get values from col1 greater than or equals to 1
df.loc[df['col1'].ge(1),'col1']

1    1
2    2
3    3
4    4
5    5

# where co11 values is better 0 and 2
df.loc[df['col1'].between(0,2)]

 col1 col2
0   0   10
1   1   11
2   2   12

# where col1 > 1
df.loc[df['col1'].gt(1)]

 col1 col2
2   2   12
3   3   13
4   4   14
5   5   15
2
ответ дан YOLO 24 August 2018 в 03:41
поделиться