Jak podzielić kolumnę, taką jak df.value

value
--------
Top/Animals/Cat
Top/Dog
Pig/Guineea/Piglet

Na wiele kolumn

val1 |   val2   | val3 |
Top    Animals     Cat
NaN      Top       Dog
Pig    Guineea    Piglet

Taki, że mam liczbę kolumn najdłuższego ciągu i NaN, gdzie inne ciągi nie mają tej samej długości?

0
Qubix 3 kwiecień 2020, 00:54

5 odpowiedzi

Najlepsza odpowiedź

Spróbujmy czegoś nowego

sep='/'
s=df.value.str.count(sep)
s=((s.max()-s).map(lambda x : x*sep)+df.value).str.split(sep,expand=True)
     0        1       2
0  Top  Animals     Cat
1           Top     Dog
2  Pig  Guineea  Piglet
2
BENY 2 kwiecień 2020, 22:09

To rozwiązanie zwraca NaN, a nie None (zgodnie z żądaniem OP)

import pandas as pd
import numpy as np

df = pd.DataFrame({"c1": ["Top/Animals/Cat",
                          "Top/Dog", 
                          "Pig/Guineea/Piglet"]})
df["c1"] = df["c1"].str.split("/")
c1_max_len = df["c1"].map(len).max()
df["c1"] = df["c1"].map(lambda x: (c1_max_len - len(x)) * [np.nan] + x)
df_exploded = pd.DataFrame(df.c1.values.tolist(), index= df.index)
0
datapug 2 kwiecień 2020, 22:12

Możesz użyć konstruktora DataFrame, aby zbudować kolumny w odwrotnej kolejności, a następnie ponownie je zindeksować:

resul = pd.DataFrame([reversed(i) for i in df['value'].str.split('/')])
resul = resul.reindex(reversed(resul.columns), axis=1)
resul.columns = ['val' + str(i+1) for i in range(len(resul.columns))]

Daje zgodnie z oczekiwaniami:

   val1     val2    val3
0   Top  Animals     Cat
1  None      Top     Dog
2   Pig  Guineea  Piglet
0
Serge Ballesta 2 kwiecień 2020, 22:09
  • Możesz najpierw odwrócić kolejność ciągu, a następnie użyć str.split z parametrem expand
df = pd.DataFrame({'value' : ['Top/Animals/Cat', 'Top/Dog', 'Pig/Guineea/Piglet', 'Top']})

# reverse string first. Top/Animals/Cat will become Cat/Animals/
df = df['value'].apply(lambda x : '/'.join(x.split('/')[::-1])).str.split('/', expand=True) 

# column renaming and order
df.columns = ['val' + str(i) for i in range(len(df.columns), 0,-1)]
df = df[df.columns[::-1]]
df

Wynik

    val1    val2    val3
0   Top     Animals Cat
1   None    Top     Dog
2   Pig     Guineea Piglet
3   None    None    Top
0
Poojan 2 kwiecień 2020, 22:08

.str.split() expand=True jest tu twoim przyjacielem!

df['value'].str.split('/', expand=True)
1
jorijnsmit 2 kwiecień 2020, 22:00