Здесь 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