Вариант 1
Используйте df.merge
out = df1.merge(df2, left_on='store', right_on='store_code')\
[['id', 'store', 'address', 'warehouse']]
print(out)
id store address warehouse
0 1 100 xyz Land
1 2 200 qwe Sea
2 3 300 asd Land
3 4 400 zxc Land
4 5 500 bnm Sea
Вариант 2
Используя pd.concat
и df.sort_values
out = pd.concat([df1.sort_values('store'),\
df2.sort_values('store_code')[['warehouse']].reset_index(drop=1)], 1)
print(out)
id store address warehouse
0 1 100 xyz Land
1 2 200 qwe Sea
2 3 300 asd Land
3 4 400 zxc Land
4 5 500 bnm Sea
Первый вызов сортировки избыточен, если ваш фреймворк уже отсортирован на store
, и в этом случае вы можете его удалить.
Вариант 3
Использование df.replace
s = df1.store.replace(df2.set_index('store_code')['warehouse'])
print(s)
0 Land
1 Sea
2 Land
3 Land
4 Sea
df1['warehouse'] = s
print(df1)
id store address warehouse
0 1 100 xyz Land
1 2 200 qwe Sea
2 3 300 asd Land
3 4 400 zxc Land
4 5 500 bnm Sea
Альтернативно, создайте отображение явно. Это работает, если вы хотите использовать его позже.
mapping = dict(df2[['store_code', 'warehouse']].values) # separate step
df1['warehouse'] = df1.store.replace(mapping) # df1.store.map(mapping)
print(df1)
id store address warehouse
0 1 100 xyz Land
1 2 200 qwe Sea
2 3 300 asd Land
3 4 400 zxc Land
4 5 500 bnm Sea
System.out инициализируется null
при создании экземпляра класса. Это задается методом nullPrintStream()
в System.java
, который просто возвращает null
.
Когда JVM инициализируется, он вызывает метод initializeSystemClass()
. Этот метод вызывает метод native
setOut0()
, который устанавливает переменную out
в соответствующее значение.
Это может показаться странным, но это необходимая операция по следующим причинам:
out
не может быть установлен статически на значение, потому что System
должен быть одним из первых загруженных классов (до PrintStream
). out
должен быть final
, так что его значение не может быть напрямую переопределено пользователем. out
нельзя установить статически и является окончательным, мы должны переопределить семантика языка с использованием метода native
, setOut0()
. Надеюсь, это поможет вам понять.
System.out
является нормальным статическим атрибутом, он был установлен JVM через метод initializeSystemClass()
во время инициализации JVM. Вы можете даже изменить его (хотя это не рекомендуется), просто называя System.setOut(printOutStream);
, где printOutStream
- это поток, который вы хотите использовать в качестве стандартного вывода.
Вот хороший article подробно описано, как работает System.out.println ().
out - объект класса PrintStream, определенный в классе System. out объявлен как открытый, статический и окончательный.
System.out.println () -
Учитывая это, давайте разберем это, начиная с оператора точки. В Java оператор точки может использоваться только для вызова методов и переменных, поэтому мы знаем, что 'out' должен быть либо методом, либо переменной. Теперь, как мы классифицируем «выход»? Ну, «выход» не мог быть методом из-за того, что скобок нет («) (после), что означает, что это явно не метод, который вызывается. И «out» не принимает никаких аргументов, потому что только методы принимают аргументы - вы никогда не увидите что-то вроде «System.out (2,3) .println». Это означает, что «выход» должен быть переменной.
'out' вызывается с именем самого класса System, а не экземпляром класса (объекта), тогда мы знаем, что 'out' должен быть статической переменной, поскольку только статическая переменные могут вызываться только с именем класса. Итак, теперь мы знаем, что «out» - это статическая членная переменная, принадлежащая классу System.
Заметив тот факт, что 'println ()' явно является методом, мы можем далее классифицировать 'out' в System .out.println (). Мы уже рассудили, что «out» - статическая переменная, принадлежащая классу System. Но теперь мы можем видеть, что «выход» должен быть экземпляром класса, потому что он вызывает метод «println ()».
Процесс мысли, который следует использовать для получения ответа, преднамеренно проиллюстрировано выше. Не зная точного ответа заранее, вы можете приблизиться к нему, применив некоторые базовые знания Java. Большинство интервьюеров не ожидали, что вы узнаете, как System.out.println () работает сверху, но скорее увидит, что вы используете свои базовые знания Java, чтобы получить ответ, близкий к точному.
Более точный ответ на исходный вопрос таков: внутри класса System это объявление «out», которое выглядит так: «public static final PrintStream out», а внутри класса Prinstream - это объявление «println ()», который имеет подпись метода, которая выглядит так: «public void println ()».
Вот как выглядят разные фрагменты System.out.println ():
//the System class belongs to java.lang package
class System {
public static final PrintStream out;
//...
}
//the Prinstream class belongs to java.io package
class PrintStream{
public void println();
//...
}
В библиотеках времени исполнения Oracle Java он создается изначально с использованием нативного метода registerNatives()
, который вызывается (через инициализатор static
) при загрузке класса System
. Это, однако, деталь реализации.
Вы также можете установить System.out
напрямую, используя System.setOut()
.
Когда инициализируется системный класс, он вызывает свой метод initializeSystemClass()
, вот код:
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
В этом коде setOut0()
есть встроенная функция, реализованная в System.c:
JNIEXPORT void JNICALL
Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream)
{
jfieldID fid =
(*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");
if (fid == 0)
return;
(*env)->SetStaticObjectField(env,cla,fid,stream);
}
Это стандартный JNI-код, который устанавливает System.out в переданный ему аргумент, этот метод вызывает собственный метод setOut0 (), который устанавливает переменную out в соответствующее значение.
System.out
является окончательным, это означает, что в initializeSystemClass () не может быть установлено что-то еще, но с использованием собственного кода можно изменить конечную переменную.
System.out предоставляется JVM. К моменту вызова вашего основного метода System.out открыт и готов к использованию.
См. http://docs.oracle.com/javase/1.5.0/docs/api/ Java / языки / System.html # из
Out in System.out.pritln - это статическое поле (объект) PrintWriter в классе System, а println - метод PrintWriter.
Ссылка: System: http: // docs. oracle.com/javase/6/docs/api/java/lang/System.html PrintWriter: http://docs.oracle.com/javase/6/docs/api/java/io/ PrintWriter.html
System.out.println ();
здесь println является объектом класса printstream. Мы не можем напрямую создавать объект для класса printstream. Out - объект системного класса. out называется полем в системном классе. при вызове system.out он косвенно создает объект для класса printstream. поэтому мы можем вызвать метод println (), используя System.out.prontln ().
Нет необходимости идти на чистую и документацию. Мы можем просто сказать javap java.lang.System, это дает вам список всех статических полей, прототипов методов, принадлежащих классу System. Мы можем получить информацию о любом классе java с помощью javap, если вы знаете, что его пакет и имя класса являются общедоступным статическим объектом PrintStream, определенным в классе System.