Если у вас есть ключ, который повторяется для каждой строки, вы можете создать декартово произведение с использованием слияния (как в SQL).
from pandas import DataFrame, merge
df1 = DataFrame({'key':[1,1], 'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'key':[1,1], 'col3':[5,6]})
merge(df1, df2,on='key')[['col1', 'col2', 'col3']]
См. здесь документацию: http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational-algebra
Они - в значительной степени то же - единственная разница - то, что переменная, которую Вы передаете как out
параметр, не должна быть инициализирована, но передача его как ref
параметр, это должно быть установлено на что-то.
int x;
Foo(out x); // OK
int y;
Foo(ref y); // Error: y should be initialized before calling the method
Ref
параметры для данных, которые могли бы быть изменены, out
, параметры для данных, это - дополнительный вывод для функции (например, int.TryParse
), которые уже используют возвращаемое значение для чего-то.
Это и касательно Пара-Мертера в C# имеет некоторые хорошие примеры.
обрисованное в общих чертах основное различие - то, что out
параметры не должны быть инициализированы, когда передано в, в то время как касательно параметров делают.
и касательно точно то же за исключением того, что переменные не должны быть инициализированы прежде, чем отправить его в пропасть. Я не настолько умен, я запер это из библиотеки MSDN:).
, Чтобы быть более явным об их использовании, однако, значение модификатора состоит в том, что, если Вы изменяетесь, ссылка той переменной в Вашем коде, и касательно заставит Вашу переменную вызова изменять ссылку также. В коде ниже, переменная генерального директора будет ссылкой на newGuy, как только это возвращается от вызова до doStuff. Если бы не касательно (или) не была бы изменена ссылка.
private void newEmployee()
{
Person ceo = Person.FindCEO();
doStuff(ref ceo);
}
private void doStuff(ref Person employee)
{
Person newGuy = new Person();
employee = newGuy;
}
касательно будет, вероятно, дросселировать на пустом указателе, так как он, по-видимому, ожидает изменять существующий объект. ожидает пустой указатель, так как он возвращает новый объект.
Касательно ключевого слова используется для передачи значений ссылкой. (Это не устраняет переданные значения, являющиеся типами значения или ссылочными типами). Выходные параметры, определенные с ключевым словом, для возврата значений из метода.
Одно основное отличие в коде - то, что необходимо установить значение выходного параметра в рамках метода. Дело обстоит не так для касательно параметров.
для получения дополнительной информации взгляд http://www.blackwasp.co.uk/CSharpMethodParameters.aspx
out
параметры инициализируются названным методом, ref
, параметры инициализируются прежде, чем назвать метод. Поэтому out
параметры используются, когда просто необходимо получить вторичное возвращаемое значение, ref
, параметры используются для получения значения , и потенциально возвращают изменение в том значении (во вторую очередь к основному возвращаемому значению).
Касательно параметров не требуются, чтобы быть установленным в функции, тогда как параметры должны быть связаны со значением прежде, чем выйти из функции. Переменные передали, как может также быть передан функции без того, чтобы быть инициализированным.
, Почему делает C#, имеют и 'касательно' и?
вызывающая сторона метода, который берет параметр, не обязана присваивать переменной, переданной как параметр до вызова; однако, вызываемый обязан присваиваться к параметр перед возвратом.
По контрасту касательно параметров считаются первоначально присвоенными вызывающей стороной. По сути, вызываемый не обязан присваиваться к касательно параметра перед использованием. Касательно параметров передаются и в и из метода.
Так, out
средства, в то время как ref
для в и.
Они соответствуют тесно [out]
и [in,out]
параметры COM-интерфейсов, преимущества out
параметры, являющиеся тем, вызывающие стороны не должны передавать предварительно выделенный объект в случаях, где это не нужно называемым методом - это избегает и стоимости выделения и любой стоимости, которая могла бы быть связана с маршалингом (более вероятно с COM, но весьма распространенный в.NET).
ref
и out
оба позволяют вызываемому методу изменить параметр. Различие между ними - то, что происходит прежде , Вы выполняете вызов.
ref
средства, что параметр имеет значение на нем прежде вход в функцию. Вызванная функция может считать и или изменить значение любое время. параметр входит, затем выходит
out
средства, что параметр не имеет никакого официального значения перед входом в функцию. Вызванная функция должна инициализировать его. параметр только выходит
, Вот мой любимый способ посмотреть на него: ref
должен передать переменные ссылкой. out
должен объявить вторичное устройство возвращаемое значение для функции. Это похоже, если Вы могли бы записать это:
// This is not C#
public (bool, string) GetWebThing(string name, ref Buffer paramBuffer);
// This is C#
public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);
Вот более подробный список эффектов каждой альтернативы:
ref
: вызывающая сторона должна установить значение параметра прежде, чем передать его вызываемому методу.
out
: метод вызывающей стороны не требуется установить значение аргумента прежде, чем назвать метод. Скорее всего, Вы не были должны. На самом деле любое текущее значение отбрасывается.
ref
: вызываемый метод может считать аргумент в любое время.
out
: вызываемый метод должен инициализировать параметр прежде, чем считать его.
ref
: текущее значение упорядочивается к удаленному вызову. Дополнительная производительность стоится.
out
: Ничто не передается удаленному вызову. Быстрее.
С технической точки зрения, Вы могли всегда использовать ref
вместо [1 114], но out
позволяет Вам быть более точными о значении аргумента, и иногда это может быть намного более эффективно.
Пример для: Variable получает значение, инициализированное после входа в метод. Позже то же значение возвращается к основному методу.
namespace outreftry
{
class outref
{
static void Main(string[] args)
{
yyy a = new yyy(); ;
// u can try giving int i=100 but is useless as that value is not passed into
// the method. Only variable goes into the method and gets changed its
// value and comes out.
int i;
a.abc(out i);
System.Console.WriteLine(i);
}
}
class yyy
{
public void abc(out int i)
{
i = 10;
}
}
}
Вывод:
10
пример ===============================================
для Касательно: Variable должен быть инициализирован перед входом в метод. Позже то же значение или измененное значение будут возвращены к основному методу.
namespace outreftry
{
class outref
{
static void Main(string[] args)
{
yyy a = new yyy(); ;
int i = 0;
a.abc(ref i);
System.Console.WriteLine(i);
}
}
class yyy
{
public void abc(ref int i)
{
System.Console.WriteLine(i);
i = 10;
}
}
}
Вывод:
0 10
=================================
Hope его ясное теперь.
ref
должна быть инициализирована перед ее передачей. out
должна быть установлена в вашей реализации функции out
параметры могут считаться дополнительными возвращаемыми переменными (не входными) ref
параметры можно рассматривать как входные и выходные переменные. out
указывает, что параметр является выходными параметрами, т.е. значение, пока оно не будет явно установлено методом.
ref
указывает, что значение является ссылкой, имеющей значение, значение которой вы можете изменить внутри метода.