Разделите и замените все строки в pandas кадре данных - PullRequest
0 голосов
/ 28 января 2020

У меня есть большой фрейм данных, где каждая строка содержит строку. Я хочу разбить каждую строку на несколько столбцов, а также заменить два типа символов.

Приведенный ниже код выполняет свою работу, но на большом кадре данных он выполняется медленно. Есть ли более быстрый способ, чем использовать для l oop?

import re
import pandas as pd

df = pd.DataFrame(['[3.4, 3.4, 2.5]', '[3.4, 3.4, 2.5]'])

df_new = pd.DataFrame({'col1': [0,0], 'col2': [0,0], 'col3': [0,0]})

for i in range(df.shape[0]):
    df_new.iloc[i, :] = re.split(',', df.iloc[i, 0].replace('[', '').replace(']', ''))

Ответы [ 2 ]

1 голос
/ 28 января 2020

Вы можете сделать это с помощью:

import pandas as pd
df = pd.DataFrame(['[3.4, 3.4, 2.5]', '[3.4, 3.4, 2.5]'])

df_new = df[0].str[1:-1].str.split(",", expand=True)
df_new.columns = ["col1", "col2", "col3"]

Идея состоит в том, чтобы сначала избавиться от [ и ], а затем разделить на , и развернуть фрейм данных. Последним шагом будет переименование столбцов.

1 голос
/ 28 января 2020

Ваше решение должно быть изменено с помощью Series.str.strip и Series.str.split:

df1 = df[0].str.strip('[]').str.split(', ', expand=True).add_prefix('col')
print(df1)
  col0 col1 col2
0  3.4  3.4  2.5
1  3.4  3.4  2.5

Если важна производительность, вместо этого используйте функции понимания списка * pandas функции :

df1 = pd.DataFrame([x.strip('[]').split(', ') for x in df[0]]).add_prefix('col')

Сроки :

#20k rows
df = pd.concat([df] * 10000, ignore_index=True)

In [208]: %timeit df[0].str.strip('[]').str.split(', ', expand=True).add_prefix('col')
61.5 ms ± 1.68 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [209]: %timeit pd.DataFrame([x.strip('[]').split(', ') for x in df[0]]).add_prefix('col')
29.8 ms ± 1.85 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
...