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

Нет необходимости отключать проверку даты jQuery (и это может вызвать другие проблемы). Вам просто нужно переопределить метод range для $.validator.

По умолчанию он работает с числовыми значениями (а затем возвращается к сопоставлению строк), поэтому вы можете добавить следующий скрипт ( после jquery.validate.js и jquery.validate.unobtrusive.js, но не завернуты в $(document).ready

$.validator.methods.range = function(value, element, param) {
    if ($(element).attr('data-val-date')) {
        var min = $(element).attr('data-val-range-min');
        var max = $(element).attr('data-val-range-max');
        var date = new Date(value).getTime();
        var minDate = new Date(min).getTime();
        var maxDate = new Date(max).getTime();
        return this.optional(element) || (date >= minDate && date <= maxDate);
    }
    // use the default method
    return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
};

. Затем вы можете использовать RangeAttribute в своем свойстве

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
public DateTime Date { get; set; }
0
задан Anand Shukla 2 March 2019 в 08:36
поделиться

4 ответа

i = 0
while True:
    try:
        for j in column_names:
            d[j].append(data[i])
            i += 1

    except Exception as er:  #So when i value exceed by data list it comes to exception and it will break the loop as well
        print(er, "################")
        break
0
ответ дан Tanmay Shrivastava 2 March 2019 в 08:36
поделиться

Вы можете перебирать columnn_names следующим образом:

dic = {key:[] for key in column_names}
dic['name'] = row_names
for t, column_name in enumerate(column_names):
    i = t
    while i< len(data):
        dic[column_name].append(data[i])
        i += 3

Перечислять будут автоматически перебирать через t формы 0 до len(column_names)-1

0
ответ дан Platon 2 March 2019 в 08:36
поделиться

Если вы используете Python 3.x, как предложено в 159 , вы можете использовать диктант понимания, а затем создать из него DataFrame Pandas, используя имена в качестве индексов строк:

[ 110]

На самом деле, промежуточный словарь является вложенным словарем: ключи внешнего словаря являются метками строк (в данном случае это элементы списка row_names); значение, связанное с каждым ключом, представляет собой словарь, ключами которого являются метки столбцов (т. е. элементы в column_names), а значения являются соответствующими элементами в списке data.

Функция from_dict используется для создания экземпляра DataFrame.

Итак, предыдущий код дает следующий результат:

     height weight grade
jack    100     50     A
mick    107     62     B
nick    103     64     C
pick    105     78     D
0
ответ дан PieCot 2 March 2019 в 08:36
поделиться

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

Фрейм данных можно представить двумя разными способами:
Один - это традиционный набор строк.

'row 0':  ['jack', 100, 50, 'A'],
'row 1':  ['mick', 107, 62, 'B']

Тем не менее, есть второе представление, которое более полезно, хотя, возможно, не так интуитивно на первый взгляд.
Коллекция столбцов:

'name': ['jack', 'mick'],
'height': ['100', '107'],
'weight': ['50', '62'],
'grade': ['A', 'B']

Теперь, вот ключевая вещь, которую нужно осознать, 2-е представление более полезно, потому что это представление поддерживается и используется во фреймах данных. ]
Он не сталкивается с конфликтом типов данных в пределах одной группировки (каждый столбец должен иметь 1 фиксированный тип данных) Однако в представлении строки типы данных могут различаться.
Кроме того, операции могут выполняться легко и согласованно для всего столбца из-за этой согласованности, которую нельзя гарантировать подряд.

Итак, tl; dr DataFrames по сути являются коллекциями столбцов одинаковой длины.

Таким образом, словарь в этом представлении может быть легко преобразован в DataFrame.

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries

row_names = ["jack", "mick"]

data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries

Итак, имея в виду, первое, что нужно понять, это то, что в своем текущем формате data очень плохое представление. Это набор строк, объединенных в один список.

Первое, что нужно сделать, если вы сами контролируете, как формируются данные, - это не подготовить их таким образом.

Цель - список для каждого столбца, и в идеале, подготовить список в этом формате.

Однако теперь, если он задан в этом формате, вам нужно выполнить итерацию и собрать значения соответствующим образом. Вот способ сделать это

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries
row_names = ["jack", "mick"]
data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries

dic = {key:[] for key in column_names}
dic['name'] = row_names
print(dic)

Вывод на данный момент:

{'height': [],
 'weight': [],
 'grade': [],
 'name': ['jack', 'mick']} #so, now, names are a column representation with all correct values.

remaining_cols = column_names[1:]

#Explanations for the following part given at the end
data_it = iter(data)
for row in zip(*([data_it] * len(remaining_cols))):
    for i, val in enumerate(row):
        dic[remaining_cols[i]].append(val)

print(dic)

Вывод:

{'name': ['jack', 'mick'],
 'height': [100, 107],
 'weight': [50, 62],
 'grade': ['A', 'B']}

И мы закончили с представлением

[ 1135] Наконец:

import pd
df = pd.DataFrame(dic, columns = column_names)
print(df)
   name  height  weight grade
0  jack     100      50     A
1  mick     107      62     B

Редактировать: Некоторое объяснение части почтового индекса: zip берет любые итерации и позволяет нам проходить через них вместе.

data_it = iter(data) #prepares an iterator. 

[data_it] * len(remaining_cols) #creates references to the same iterator

Здесь это похоже на [data_it, data_it, data_it]

* в *[data_it, data_it, data_it] позволяет нам вместо этого распаковать список в 3 аргумента для функции zip, поэтому f(*[data_it, data_it, data_it]) эквивалентно на f(data_it, data_it, data_it) для любой функции е.

магия здесь в том, что прохождение через итератор / продвижение итератора теперь будет отражать изменения во всех ссылках

Собрав все это вместе: zip(*([data_it] * len(remaining_cols))) фактически позволит нам взять 3 элемента из данных за один раз. время, и присвоить его строке Итак, row = (100, 50, 'A') в первой итерации zip

for i, val in enumerate(row): #just iterate through the row, keeping index too using enumerate
    dic[remaining_cols[i]].append(val) #use indexes to access the correct list in the dictionary

Надеюсь, что помогает.

0
ответ дан Paritosh Singh 2 March 2019 в 08:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: