Используйте GroupBy.transform
для возврата Series
с тем же размером, что и оригинал DataFrame
, поэтому можно присвоить новый столбец:
df['B'] = df['B'].astype(str)
df['B_concat'] = df.groupby(['A'])['B'].transform('/'.join)
Решение одной строкой должно быть: [ 118]
df['B_concat'] = df['B'].astype(str).groupby(df['A']).transform('/'.join)
print (df)
A B B_concat
0 1 345 345
1 2 366 366
2 3 299 299/455
3 3 455 299/455
4 4 879 879
5 5 321 321/957
6 5 957 321/957
7 6 543 543
Или:
df['B_concat'] = df.groupby(['A'])['B'].transform(lambda x: '/'.join(x.astype(str)))
Сделанная на заказ этикетировочная машина требуется для этого. По необходимости наш поставщик управления исходным кодом, и мы получаем наш номер версии из него. Код следующие:
/// <summary>
/// Gets the latest change list number from perforce, for ccnet to consume as a build label.
/// </summary>
[ReflectorType( "p4labeller" )]
public class PerforceLabeller : ILabeller
{
// perforce executable (optional)
[ReflectorProperty("executable", Required = false)]
public string P4Executable = "p4.exe";
// perforce port (i.e. myserver:1234)
[ReflectorProperty("port", Required = false)]
public string P4Port = String.Empty;
// perforce user
[ReflectorProperty("user", Required = false)]
public string P4User = String.Empty;
// perforce client
[ReflectorProperty("client", Required = false)]
public string P4Client = String.Empty;
// perforce view (i.e. //Dev/Code1/...)
[ReflectorProperty("view", Required = false)]
public string P4View = String.Empty;
// Returns latest change list
public string Generate( IIntegrationResult previousLabel )
{
return GetLatestChangelist();
}
// Stores latest change list into a label
public void Run( IIntegrationResult result )
{
result.Label = GetLatestChangelist();
}
// Gets the latest change list
public string GetLatestChangelist()
{
// Build the arguments to pass to p4 to get the latest changelist
string theArgs = "-p " + P4Port + " -u " + P4User + " -c " + P4Client + " changes -m 1 -s submitted " + P4View;
Log.Info( string.Format( "Getting latest change from Perforce using --> " + theArgs ) );
// Execute p4
ProcessResult theProcessResult = new ProcessExecutor().Execute( new ProcessInfo( P4Executable, theArgs ) );
// Extract the changelist # from the result
Regex theRegex = new Regex( @"\s[0-9]+\s", RegexOptions.IgnoreCase );
Match theMatch = theRegex.Match( theProcessResult.StandardOutput );
return theMatch.Value.Trim();
}
}
Метод, GetLatestChangelist, то, где Вы, вероятно, вставили бы свою собственную логику, чтобы говорить с Вашей системой управления версиями. В По необходимости существует идея последнего changelist, который уникален. Наши номера сборки и в конечном счете номера версий базируются прочь этого.
После того как Вы создаете это (в блок dll), необходимо будет сцепить его в ccnet. Можно просто бросить блок в каталог сервера (рядом с ccnet.exe).
Затем Вы изменяете свой ccnet файл проекта для использования этой маркировочной машины. Мы сделали это с блоком маркировочной машины по умолчанию. Что-то как следующее:
<project>
<labeller type="p4labeller">
<client>myclient</client>
<executable>p4.exe</executable>
<port>myserver:1234</port>
<user>myuser</user>
<view>//Code1/...</view>
</labeller>
<!-- Other project configuration to go here -->
</project>
Если Вы просто желаете, чтобы номер сборки обнаружился в ccnet затем, Вы сделаны и не должны действительно делать ничего больше. Однако можно получить доступ к маркировке в сценарии NAnt, если Вы желаете при помощи уже обеспеченного свойства CCNetLabel.
Надежда это помогает некоторым. Сообщите мне, есть ли у Вас какие-либо вопросы путем регистрации на комментарии.
Вы пытались использовать некоторые переменные среды? Я полагаю, что CCNet может обработать их.
Я вырою немного на этом.
Хорошо я вижу решение, довольно грязное, но во всяком случае:
1-Добавляют раздел defaultlabeller в Вашем определении проекта CCNET. Это будет содержать шаблон номера сборки, который Вы хотите отобразить.
2-В NAnt, имейте сценарий для обновления конфигурационного файла, вставляя номер сборки, который Вы хотите видеть.
3-Касаний (в смысле Unix) ccnet.exe.config файл, чтобы заставить его перезагрузить конфигурационные файлы проектов.
и voilà.
У нас была эта проблема также. Я закончил тем, что писал специальный плагин маркировки CC.
Если Ваши номера сборки последовательны, можно просто взломать файл состояния круиз-контроля, чтобы дать ему корректный номер сборки для запуска с. Ваш поиск файла назвал [projectName].state.
Я изменил элемент Маркировки на корректное число и LastSuccessfulIntegrationLabel, чтобы быть новым числом.
Однако мы только недавно получили CruiseControl, таким образом, наш официальный номер сборки отличается от того, что перечислено в CruiseControl.
Вид, вроде какой сказанный gbanfill, можно сказать CC что номера сборки начать с, но нет никакой потребности взломать .ser файл. Можно использовать интерфейс JMX для установки текущего номера сборки для получения его в синхронизации с номером сборки NAnt.
Можно также установить значение маркировки по умолчанию к к текущему номеру сборки, удалить .ser файл и перезапустить CC.
Но возможно самая легкая вещь состоит в том, чтобы записать номер сборки в файл свойств от NAnt и затем использовать инкрементор маркировки файла свойств для чтения того файла. (Убедитесь установить setPreBuildIncrementer = "верный"),