Вы можете использовать конструктор DataFrame
с lists
, созданный путем преобразования в numpy array
с помощью values
с tolist
:
import pandas as pd
d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)
teams
0 [SF, NYG]
1 [SF, NYG]
2 [SF, NYG]
3 [SF, NYG]
4 [SF, NYG]
5 [SF, NYG]
6 [SF, NYG]
df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
print (df2)
teams team1 team2
0 [SF, NYG] SF NYG
1 [SF, NYG] SF NYG
2 [SF, NYG] SF NYG
3 [SF, NYG] SF NYG
4 [SF, NYG] SF NYG
5 [SF, NYG] SF NYG
6 [SF, NYG] SF NYG
И для нового DataFrame
:
df3 = pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2'])
print (df3)
team1 team2
0 SF NYG
1 SF NYG
2 SF NYG
3 SF NYG
4 SF NYG
5 SF NYG
6 SF NYG
Решение с apply(pd.Series)
очень медленно:
#7k rows
df2 = pd.concat([df2]*1000).reset_index(drop=True)
In [89]: %timeit df2['teams'].apply(pd.Series)
1 loop, best of 3: 1.15 s per loop
In [90]: %timeit pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2'])
1000 loops, best of 3: 820 µs per loop
Я не могу проверить это, чтобы подтвердить, но я считаю, что это возможно без написания каких-либо плагинов.
Вы можете развернуть на SourceForge, используя SCP , и плагин maven-deploy-plugin можно настроить на использование SCP , поэтому он должен работать. Вы также можете развернуть свой сайт на SourceForge через SCP.
Вы должны сконфигурировать сервер SourceForge в вашем settings.xml для использования «комбинированного» имени пользователя с разделителем запятыми. С этими учетными данными:
SourceForge username: foo
SourceForge user password: secret
SourceForge project name: bar
Path: /home/frs/project/P/PR/PROJECT_UNIX_NAME/
- Substitute your project UNIX name data for /P/PR/PROJECT_UNIX_NAME
Серверный элемент будет выглядеть так:
<server>
<id>sourceforge</id>
<username>foo,bar</username>
<password>secret</password>
</server>
А раздел distributionManagement в вашем POM будет выглядеть так:
<!-- Enabling the use of FTP -->
<distributionManagement>
<repository>
<id>ssh-repository</id>
<url>
scpexe://frs.sourceforge.net:/home/frs/project/P/PR/PROJECT_UNIX_NAME</url>
</repository>
</distributionManagement>
Наконец, объявите, что должен использоваться ssh-external:
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh-external</artifactId>
<version>1.0-alpha-5</version>
</extension>
</extensions>
</build>
Если это не так не работает, вы можете использовать рекомендуемый подход из ссылки на сайт выше, т.е. создать оболочку на shell.sourceforge. net с вашим именем пользователя и группой проекта:
ssh -t <username>,<project name>@shell.sf.net create
Затем используйте shell.sourceforge.net (вместо web.sourceforge.net) в URL-адресе вашего сайта в разделе diestributionManagement:
<url>scp://shell.sourceforge.net/home/frs/project/P/PR/PROJECT_UNIX_NAME/</url>
Знаток плагин SourceForge не работает со Знатоком 2. Также я полагаю, что этот плагин использует FTP, который больше не поддерживается.
Похоже, что я оказываюсь перед необходимостью писать это сам.
Я нашел, что CruiseControl может загрузить выпуски на SFEE и также работает со Знатоком и Maven2
public bool EqualsDefaultValue<T>(T value)
{
return EqualityComparer<T>.Default.Equals(value, default(T));
}
-121--3210691- Мне понравился ответ Клайма, поэтому я написал это очень быстро. Я не утверждаю идеальной правоты, но это выглядит довольно хорошо для меня. (то есть единственным испытанием является образец основной
ниже)
Это универсальный ленивый инициализатор. Пространство для объекта выделяется один раз, и объект начинается с нуля. Затем можно создать
, перезаписав предыдущие объекты без новых выделений памяти.
Реализует все необходимые конструкторы, деструктор, копирование/присвоение, своп, ядда-ядда. Вот вам:
#include <cassert>
#include <new>
template <typename T>
class lazy_object
{
public:
// types
typedef T value_type;
typedef const T const_value_type;
typedef value_type& reference;
typedef const_value_type& const_reference;
typedef value_type* pointer;
typedef const_value_type* const_pointer;
// creation
lazy_object(void) :
mObject(0),
mBuffer(::operator new(sizeof(T)))
{
}
lazy_object(const lazy_object& pRhs) :
mObject(0),
mBuffer(::operator new(sizeof(T)))
{
if (pRhs.exists())
{
mObject = new (buffer()) T(pRhs.get());
}
}
lazy_object& operator=(lazy_object pRhs)
{
pRhs.swap(*this);
return *this;
}
~lazy_object(void)
{
destroy();
::operator delete(mBuffer);
}
// need to make multiple versions of this.
// variadic templates/Boost.PreProccesor
// would help immensely. For now, I give
// two, but it's easy to make more.
void create(void)
{
destroy();
mObject = new (buffer()) T();
}
template <typename A1>
void create(const A1 pA1)
{
destroy();
mObject = new (buffer()) T(pA1);
}
void destroy(void)
{
if (exists())
{
mObject->~T();
mObject = 0;
}
}
void swap(lazy_object& pRhs)
{
std::swap(mObject, pRhs.mObject);
std::swap(mBuffer, pRhs.mBuffer);
}
// access
reference get(void)
{
return *get_ptr();
}
const_reference get(void) const
{
return *get_ptr();
}
pointer get_ptr(void)
{
assert(exists());
return mObject;
}
const_pointer get_ptr(void) const
{
assert(exists());
return mObject;
}
void* buffer(void)
{
return mBuffer;
}
// query
const bool exists(void) const
{
return mObject != 0;
}
private:
// members
pointer mObject;
void* mBuffer;
};
// explicit swaps for generality
template <typename T>
void swap(lazy_object<T>& pLhs, lazy_object<T>& pRhs)
{
pLhs.swap(pRhs);
}
// if the above code is in a namespace, don't put this in it!
// specializations in global namespace std are allowed.
namespace std
{
template <typename T>
void swap(lazy_object<T>& pLhs, lazy_object<T>& pRhs)
{
pLhs.swap(pRhs);
}
}
// test use
#include <iostream>
int main(void)
{
// basic usage
lazy_object<int> i;
i.create();
i.get() = 5;
std::cout << i.get() << std::endl;
// asserts (not created yet)
lazy_object<double> d;
std::cout << d.get() << std::endl;
}
В вашем случае, просто создайте члена в вашем классе: leny _ object < B >
и вы закончили. Нет ручных выпусков или создания конструкторов копий, деструкторов и т.д. Все берется в вашем хорошем, маленьком повторно используемом классе.:)
Устранена потребность в векторе, должен сэкономить немного места, а что-нет.
Для использования стека вместо кучи используется aligned _ storage
и alignment _ of
. Я использовал boost , но эта функциональность существует как в TR1, так и в C++ 0x. Мы теряем возможность копирования, а значит, и обмена.
#include <boost/type_traits/aligned_storage.hpp>
#include <cassert>
#include <new>
template <typename T>
class lazy_object_stack
{
public:
// types
typedef T value_type;
typedef const T const_value_type;
typedef value_type& reference;
typedef const_value_type& const_reference;
typedef value_type* pointer;
typedef const_value_type* const_pointer;
// creation
lazy_object_stack(void) :
mObject(0)
{
}
~lazy_object_stack(void)
{
destroy();
}
// need to make multiple versions of this.
// variadic templates/Boost.PreProccesor
// would help immensely. For now, I give
// two, but it's easy to make more.
void create(void)
{
destroy();
mObject = new (buffer()) T();
}
template <typename A1>
void create(const A1 pA1)
{
destroy();
mObject = new (buffer()) T(pA1);
}
void destroy(void)
{
if (exists())
{
mObject->~T();
mObject = 0;
}
}
// access
reference get(void)
{
return *get_ptr();
}
const_reference get(void) const
{
return *get_ptr();
}
pointer get_ptr(void)
{
assert(exists());
return mObject;
}
const_pointer get_ptr(void) const
{
assert(exists());
return mObject;
}
void* buffer(void)
{
return mBuffer.address();
}
// query
const bool exists(void) const
{
return mObject != 0;
}
private:
// types
typedef boost::aligned_storage<sizeof(T),
boost::alignment_of<T>::value> storage_type;
// members
pointer mObject;
storage_type mBuffer;
// non-copyable
lazy_object_stack(const lazy_object_stack& pRhs);
lazy_object_stack& operator=(lazy_object_stack pRhs);
};
// test use
#include <iostream>
int main(void)
{
// basic usage
lazy_object_stack<int> i;
i.create();
i.get() = 5;
std::cout << i.get() << std::endl;
// asserts (not created yet)
lazy_object_stack<double> d;
std::cout << d.get() << std::endl;
}
И вот мы идем.
-121--2666421-Попробовав это несколько раз, я наконец получил его для работы - с sftp , а не scp. Это должно работать от unix box (или Mac) - я не уверен насчет клиентов sftp для Windoze. Я использую mvn версии 2.2.0 и не думаю, что у меня установлены специальные плагины. При этом различные пакеты mvn развертываются в разделе Files страницы проекта.
Для работы с настройками необходимо изменить следующее:
В моем файле $ HOME/.m2/settings.xml для сервера SF имеются следующие данные:
<server>
<id>sourceforge</id>
<password>secret</password>
<filePermissions>775</filePermissions>
<directoryPermissions>775</directoryPermissions>
</server>
Я не указываю имя пользователя в файле settings.xml, так как это должно быть имя пользователя, проект, и я хочу развернуть несколько пакетов в SF. Затем в моем файле pom.xml для пакета ormlite имеется следующее:
<distributionManagement>
<repository>
<id>sourceforge</id>
<name>SourceForge</name>
<url>sftp://user,ormlite@frs.sourceforge.net:/home/frs/project/o/or/ormlite/releases
</url>
</repository>
<snapshotRepository>
<id>sourceforge</id>
<name>SourceForge</name>
<url>sftp://user,ormlite@frs.sourceforge.net:/home/frs/project/o/or/ormlite/snapshots
</url>
</snapshotRepository>
</distributionManagement>
Очевидно, что суффиксы каталогов/releases и/snapshots могут быть изменены в зависимости от иерархии файлов.
Где timp = user и webmacro = project
URL-адрес scp не работает:
scp://timp,webmacro@shell.sourceforge.net:/home/groups/w/we/webmacro/htdocs/maven2/
URL-адрес sftp работает:
sftp://timp,webmacro@web.sourceforge.net:/home/groups/w/we/webmacro/htdocs/maven2
или для артефактов выпуска проекта :
sftp://timp,webmacro@web.sourceforge.net:/home/frs/project/w/we/webmacro/releases
scp будет работать с shell.sourceforge.net, но вы должны создать оболочку перед использованием с
ssh -t timp,webmacro@shell.sourceforge.net create
Я загрузил пример на sourceforge.net по адресу: http://sf-mvn-plugins.sourceforge.net/example-1jar-thinlet/
Вы можете проверить его через svn - так вы сможете увидеть, как использовать плагины для загрузки и выгрузки в область файловой системы sourceforge.net и на веб-сайт.
Основные моменты для загрузки - использование sftp:
Добавьте этот похожий код в ваш pom.xml
<distributionManagement>
<!-- use the following if you're not using a snapshot version. -->
<repository>
<id>sourceforge-sf-mvn-plugins</id>
<name>FRS Area</name>
<uniqueVersion>false</uniqueVersion>
<url>sftp://web.sourceforge.net/home/frs/project/s/sf/sf-mvn-plugins/m2-repo</url>
</repository>
<site>
<id>sourceforge-sf-mvn-plugins</id>
<name>Web Area</name>
<url>
sftp://web.sourceforge.net/home/groups/s/sf/sf-mvn-plugins/htdocs/${artifactId}
</url>
</site>
</distributionManagement>
Добавьте похожий код в settings.xml
<server>
<id>sourceforge-sf-mvn-plugins-svn</id>
<username>tmichel,sf-mvn-plugins</username>
<password>secret</password>
</server>
<server>
<id>sourceforge-sf-mvn-plugins</id>
<username>user,project</username>
<password>secret</password>
</server>
Основные моменты для загрузки - использование maven-плагина wagon-http-sourceforge - смотрите по адресу: sf-mvn-plugins. sourceforge.net/wagon-http-sourceforge/FAQ.html
Пожалуйста, добавьте следующий код в ваш pom.xml
<repositories>
<repository>
<id>sourceforge-svn</id>
<name>SF Maven Plugin SVN Repository</name>
<url>http://sf-mvn-plugins.svn.sourceforge.net/svnroot/sf-mvn-plugins/_m2-repo/trunk</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>sourceforge-frs</id>
<name>SF Maven Plugin Repository</name>
<url>http://sourceforge.net/projects/sf-mvn-plugins/files/m2-repo</url>
</pluginRepository>
</pluginRepositories>
<build>
<extensions>
<extension>
<groupId>net.sf.maven.plugins</groupId>
<artifactId>wagon-http-sourceforge</artifactId>
<version>0.4</version>
</extension>
</extensions>
:
</build>