Во-первых, мы должны понять, как должен выглядеть идеальный словарь для фрейма данных.
Фрейм данных можно представить двумя разными способами:
Один - это традиционный набор строк.
'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
Надеюсь, что помогает.
В системе могут быть доступны как 32-битные, так и 64-битные JVM, и их множество.
Если у вас уже есть dll для каждой поддерживаемой платформы - рассмотрите возможность создания небольшого исполняемого файла, который связывает и запустить, чтобы вы могли проверить, поддерживает ли платформа определенную функциональность. Если исполняемый файл связывается и запускается, вы можете установить соответствующие общие библиотеки.
В linux мой (java) vm сообщает java.vm.name = Java HotSpot (TM) 64-битная виртуальная машина сервера. Javadocs для System объявляет, что System.getProperty всегда будет иметь значение для этого, но ничего не говорит о sun.arch.data.model.
К сожалению, они не указывают, каким будет системное свойство, поэтому другая JVM может просто сообщить java.vm.name = Edgar.
Кстати, под «установленным в системе» я предполагаю, что вы имеете в виду «текущую работающую JVM»?
Используемую архитектуру JVM можно получить с помощью свойства " os.arch ":
System.getProperty("os.arch");
Часть «os», кажется, немного ошибочна, или, возможно, дизайнеры оригинала не ожидали, что JVM будут работать на архитектурах, для которых они не были написаны. Возвращаемые значения кажутся несовместимыми .
Команда установщика NetBeans решает проблему JVM против архитектуры ОС. Цитата:
x64 бит: Java и система
Отслеживается как Выпуск 143434 .
В настоящее время мы используем x64 бит JVM для определить, если система (и, следовательно, Platform.getHardwareArch ()) является 64-разрядным или не. Это определенно неправильно, так как можно запустить 32-битную JVM на 64-битная система. Мы должны найти Решение для проверки ОС на реальную 64-битность в случае запуска на 32-разрядной JVM.
- для Windows это можно сделать с помощью WindowsRegistry.IsWow64Process ()
- для Linux - путем проверки 'uname -m / -p' == x86_64
- для Solaris it. может быть сделано, например, с помощью 'isainfo -b'
- для Mac OSX, это не может быть сделано с помощью аргументов uname, возможно, это может быть решается созданием 64-битного двоичного файла и выполнение на платформе ... (к сожалению, это не работает :( Я создал двоичный файл только с x86_64 и арка ppc64, и это было успешно выполняется на Tiger ..)
- для поддержки универсального Unix - это также не ясно ... скорее всего, проверка для того же 'uname -m / -p' / 'getconf LONG_BIT 'и сравнивая его с некоторыми возможные 64-битные значения (x86_64, x64, amd64, ia64).
Примеры свойств различных JVM, работающих на 64-битной Ubuntu 8.0.4:
32-битная IBM 1.5:
java.vendor=IBM Corporation
java.vendor.url=http://www.ibm.com/
java.version=1.5.0
java.vm.info=J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20061001 (JIT enabled)
J9VM - 20060915_08260_lHdSMR
JIT - 20060908_1811_r8
GC - 20060906_AA
java.vm.name=IBM J9 VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=IBM Corporation
java.vm.version=2.3
os.arch=x86
os.name=Linux
os.version=2.6.24-23-generic
sun.arch.data.model=32
64-битная Sun 1.6:
java.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi
java.version=1.6.0_05
java.vm.info=mixed mode
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=Sun Microsystems Inc.
java.vm.version=10.0-b19
os.arch=amd64
os.name=Linux
os.version=2.6.24-23-generic
sun.arch.data.model=64
64-битная GNU 1.5:
java.vendor=Free Software Foundation, Inc.
java.vendor.url=http://gcc.gnu.org/java/
java.version=1.5.0
java.vm.info=GNU libgcj 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
java.vm.name=GNU libgcj
java.vm.specification.name=Java(tm) Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=Free Software Foundation, Inc.
java.vm.version=4.2.4 (Ubuntu 4.2.4-1ubuntu3)
os.arch=x86_64
os.name=Linux
os.version=2.6.24-23-generic
(версия GNU не сообщает о свойстве "sun.arch.data.model"; предположительно, другие JVM тоже этого не делают.)
Следующий код проверяет поле machineType в любом исполняемом файле Windows на определить, является ли он 32 или 64 битным:
public class ExeDetect
{
public static void main(String[] args) throws Exception {
File x64 = new File("C:/Program Files/Java/jre1.6.0_04/bin/java.exe");
File x86 = new File("C:/Program Files (x86)/Java/jre1.6.0/bin/java.exe");
System.out.println(is64Bit(x64));
System.out.println(is64Bit(x86));
}
public static boolean is64Bit(File exe) throws IOException {
InputStream is = new FileInputStream(exe);
int magic = is.read() | is.read() << 8;
if(magic != 0x5A4D)
throw new IOException("Invalid Exe");
for(int i = 0; i < 58; i++) is.read(); // skip until pe offset
int address = is.read() | is.read() << 8 |
is.read() << 16 | is.read() << 24;
for(int i = 0; i < address - 60; i++) is.read(); // skip until pe header+4
int machineType = is.read() | is.read() << 8;
return machineType == 0x8664;
}
}
Обратите внимание, что код был сжат для краткости ...
import sun.misc.*;
import java.lang.reflect.*;
public class UnsafeTest {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
System.out.println(unsafe.addressSize());
}
}