воспроизводимый код для данных:
import pandas as pd
dict = {"a": "[1,2,3,4]", "b": "[1,2,3,4]"}
dict = pd.DataFrame(list(dict.items()))
dict
0 1
0 a [1,2,3,4]
1 b [1,2,3,4]
Я хотел разделить/разграничить "столбец 1" и создать отдельные строки для каждого значения split.
ожидаемый результат:
0 1
0 a 1
1 a 2
2 a 3
3 a 4
4 b 1
5 b 2
6 b 3
7 b 4
Должен ли я сначала удалить скобки, а затем разделить значения? Я действительно не понимаю, как это сделать. Любая ссылка, которая поможет мне решить это, пожалуйста?
Поскольку у вас есть строки, содержащие список (а не списки) в ваших ячейках, вы можете использовать eval
:
dict_v = {"a": "[1,2,3,4]", "b": "[1,2,3,4]"}
df = pd.DataFrame(list(dict_v.items()))
df = (df.rename(columns={0:'l'}).set_index('l')[1]
.apply(lambda x: pd.Series(eval(x))).stack()
.reset_index().drop('level_1',1).rename(columns={'l':0,0:1}))
или другим способом может быть создание DataFrame
(возможно, быстрее), например:
df = (pd.DataFrame(df[1].apply(eval).tolist(),index=df[0])
.stack().reset_index(level=1, drop=True)
.reset_index(name='1'))
ваш выход
0 1
0 a 1
1 a 2
2 a 3
3 a 4
4 b 1
5 b 2
6 b 3
7 b 4
все переименовываются, чтобы получить именно ваш вход/выход
Основываясь на логике этого ответа:
s = d[1]\
.apply(lambda x: pd.Series(eval(x)))\
.stack()
s.index = s.index.droplevel(-1)
s.name = "split"
d.join(s).drop(1, axis=1)