Python: объединить столбцы на основе "\" - PullRequest
0 голосов
/ 30 августа 2018

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

Другими словами, я вижу что-то вроде этого:

index  A  B    C         D      (extra)   (extra)  (extra)  (extra)
  0    1  2  'abc\'    'def\'    'ghi\'    'jkl\'   'xyz'   some_date
  1    1  2  'abc'    some_date
  2    1  2  'abc\'    'def'    some_date

В противоположность этому:

index  A  B         C                D
  0    1  2  'abcdefghijklxyz'   some_date
  1    1  2       'abc'          some_date
  2    1  2     'abcdef'         some_date

Есть ли эффективный способ объединить столбцы, заканчивающиеся символом новой строки, с столбцом справа?

1 Ответ

0 голосов
/ 30 августа 2018

Шаг 1: Сначала вам нужно извлечь столбец 'D', который был разделен и помещен в конце непустых значений для каждой строки. Кроме того, каждое из значений из 'D' должно быть удалено из их текущих позиций. Вы можете сделать это с помощью следующего цикла:

import pandas as pd

D_col = []
for i,row in df.iterrows():
    # get the index of the last non-empty/null value in the row
    d_idx = next(j for j,x in reversed(list(enumerate(row))) if x)
    # put the value at that index in D_col
    D_col.append(row[d_idx])
    # replace that value with ''
    row.iloc[d_idx] = ''

Это удалит значения some_date из вашего DataFrame и поместит их в список D_col.

Шаг 2: Теперь вы можете использовать str.replace для удаления косой черты и str.cat для объединения столбцов. Вот пример:

from functools import reduce

columns_to_join = ['C', 'D', 'e1', 'e2', 'e3']
# first remove the slashes
cleaned_columns = [df[col].fillna('').str.replace('\\', '') for col in columns_to_join]

# create an empty Series to start reduce with
empty_series = pd.Series(['' for _ in range(len(df))])
# iterate over the cleaned columns and join them (using str.cat) into one column
C_col = reduce(lambda acc, col: acc.str.cat(col.fillna('')), cleaned_columns, empty_series)

Шаг 3: Объедините все это в один, последний DataFrame. Вот как это сделать:

new_df = pd.DataFrame(df[['A', 'B']])
new_df['C'] = C_col
new_df['D'] = D_col
...