Как разделить столбец разделителем, учитывая относительную позицию элементов, которые должны быть разделены - PullRequest
2 голосов
/ 29 марта 2020

Ниже приведен мой сценарий для общего c фрейма данных в Python с использованием pandas. Я надеюсь разделить определенный столбец во фрейме данных, чтобы создать новые столбцы, соблюдая при этом исходную ориентацию элементов в исходном столбце.

Для ясности см. Ниже. Заранее спасибо!

Мой сценарий:

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1': ['x,y,z', 'a,b', 'c']})
print(df)

Вот что я хочу

df = pd.DataFrame({'col1': ['x',np.nan,np.nan],
                    'col2': ['y','a',np.nan],
                    'col3': ['z','b','c']})
print(df)

Вот что я получаю

df = pd.DataFrame({'col1': ['x','a','c'],
                    'col2': ['y','b',np.nan],
                    'col3': ['z',np.nan,np.nan]})
print(df)

Ответы [ 3 ]

2 голосов
/ 29 марта 2020

Вы можете использовать функцию justify из этого ответа с Series.str.split:

dfn = pd.DataFrame(
    justify(df['col1'].str.split(',', expand=True).to_numpy(), 
            invalid_val=None, 
            axis=1, 
            side='right')
).add_prefix('col')

   col0  col1 col2
0     x     y    z
1  None     a    b
2  None  None    c
1 голос
/ 29 марта 2020

Попробуйте что-то вроде

s=df.col1.str.count(',')
#(s.max()-s).map(lambda x : x*',')
#0      
#1     ,
#2    ,,
Name: col1, dtype: object
(s.max()-s).map(lambda x : x*',').add(df.col1).str.split(',',expand=True)
   0  1  2
0  x  y  z
1     a  b
2        c
1 голос
/ 29 марта 2020

Вот способ настройки раскола:

max_delim = df['col1'].str.count(',').max() #count the max occurance of `,`
delim_to_add = max_delim - df['col1'].str.count(',') #get difference of count from max
# multiply the delimiter and add it to series, followed by split
df[['col1','col2','col3']] = (df['col1'].radd([','*i for i in delim_to_add])
                              .str.split(',',expand=True).replace('',np.nan))
print(df)

  col1 col2 col3
0    x    y    z
1  NaN    a    b
2  NaN  NaN    c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...