Преобразование списка Panda DF в строку
У меня есть кадр данных panda. Один из столбцов содержит список. Я хочу, чтобы этот столбец был отдельной строкой.
Например, мой список ['one', 'two', 'three'] должен быть просто 'one, two, three'
df['col'] = df['col'].astype(str).apply(lambda x: ', '.join(df['col'].astype(str)))
дает мне ['one, two, three], [' four ',' five ',' six '], где второй список из следующей строки. Разумеется, с миллионами строк эта конкатенация по строкам не только неверна, но и убивает мою память.
Ответы
Ответ 1
Вы, конечно, не должны преобразовывать в строку, прежде чем преобразовать список. Попробуйте:
df['col'].apply(', '.join)
Также обратите внимание, что apply
применяет функцию к элементам ряда, поэтому использование df['col']
в лямбда-функции, вероятно, не то, что вам нужно.
Изменить: спасибо Якиму за то, что он указал, что нет необходимости в лямбда-функции.
Ответ 2
Когда вы отбрасываете col
в str
с помощью astype
, вы получаете строковое представление списка, скобок и всего списка python. Вам не нужно это делать, просто apply
join
напрямую:
import pandas as pd
df = pd.DataFrame({
'A': [['a', 'b', 'c'], ['A', 'B', 'C']]
})
# Out[8]:
# A
# 0 [a, b, c]
# 1 [A, B, C]
df['Joined'] = df.A.apply(', '.join)
# A Joined
# 0 [a, b, c] a, b, c
# 1 [A, B, C] A, B, C
Ответ 3
Вы можете преобразовать свой список в str с помощью astype(str)
, а затем удалить символы '
, [
, ]
. Использование примера @Yakim:
In [114]: df
Out[114]:
A
0 [a, b, c]
1 [A, B, C]
In [115]: df.A.astype(str).str.replace('\[|\]|\'', '')
Out[115]:
0 a, b, c
1 A, B, C
Name: A, dtype: object
Timing
import pandas as pd
df = pd.DataFrame({'A': [['a', 'b', 'c'], ['A', 'B', 'C']]})
df = pd.concat([df]*1000)
In [2]: timeit df['A'].apply(', '.join)
292 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [3]: timeit df['A'].str.join(', ')
368 µs ± 24.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [4]: timeit df['A'].apply(lambda x: ', '.join(x))
505 µs ± 5.74 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [5]: timeit df['A'].str.replace('\[|\]|\'', '')
2.43 ms ± 62.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)