Панды применяются и назначаются нескольким столбцам - PullRequest
1 голос
/ 07 октября 2019

У меня есть фрейм данных с таким столбцом, как:

col 
a2_3
f4_4
c4_1

Я хочу добавить два столбца из этого столбца, например так:

col   col1   col2   col3
a2_3    a      2     3
f4_4    f      4     4
c4_1    c      4     1

Следующее не работает:

df[['col1', 'col2', 'col3']] = df['col'].apply(lambda s: (s[1], *s[1:].split("_")) )

Как назначить серию кортежей новым столбцам?

1 Ответ

2 голосов
/ 07 октября 2019

Здесь apply не требуется, сначала индексирование с помощью str, а затем использование Series.str.split с expand=True:

df[['col1', 'col2']] = df['col'].str[1:].str.split("_", expand=True)
print (df)
    col col1 col2
0  a2_3    2    3
1  f4_4    4    4
2  c4_1    4    1

Ваше решение возможно с Series конструктор, но он медленный:

df[['col1', 'col2']] = df['col'].apply(lambda s: pd.Series(s[1:].split("_")))

Быстрее использовать конструктор DataFrame:

df1 = pd.DataFrame(df['col'].apply(lambda s: s[1:].split("_")).tolist(), index=df.index)
df[['col1', 'col2']] = df1

Или составить список:

df[['col1', 'col2']] = pd.DataFrame([s[1:].split("_") for s in df['col']], index=df.index)

РЕДАКТИРОВАТЬ: Решение аналогично:

L = df['col'].apply(lambda s: (s[0], *s[1:].split("_"))).tolist()
df[['col1', 'col2', 'col3']] = pd.DataFrame(L, index=df.index)

df[['col1', 'col2', 'col3']] = pd.DataFrame([(s[0], *s[1:].split("_")) for s in df['col']], 
                                 index=df.index)
print (df)
    col col1 col2 col3
0  a2_3    a    2    3
1  f4_4    f    4    4
2  c4_1    c    4    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...