разделить строки в панде - PullRequest
       10

разделить строки в панде

5 голосов
/ 23 октября 2019

Я застрял с проблемой, как разделить кадр данных панды на строку,

У меня есть похожий кадр данных со столбцом, где значения разделены \ r \ n, и они находятся в одной ячейке,

    Color                              Shape  Price
0  Green  Rectangle\r\nTriangle\r\nOctangle     10
1   Blue              Rectangle\r\nTriangle     15 

и мне нужно разделить эту ячейку на несколько ячеек с такими же значениями других столбцов, как здесь

   Color      Shape  Price
0  Green  Rectangle     10
1  Green   Triangle     10
2  Green   Octangle     10
3   Blue  Rectangle     15
4   Blue    Tringle     15

как это сделать лучше?

Ответы [ 4 ]

2 голосов
/ 23 октября 2019

Вы можете сделать:

df["Shape"]=df["Shape"].str.split("\r\n")
print(df.explode("Shape").reset_index(drop=True))

Вывод:

   Color    Shape   Price
0   Green   Rectangle   10
1   Green   Triangle    10
2   Green   Octangle    10
3   Blue    Rectangle   15
4   Blue    Triangle    15
1 голос
/ 23 октября 2019

Возможно, это не самый эффективный способ сделать это, но я могу подтвердить, что он работает с примером df:

data = [['Green', 'Rectangle\r\nTriangle\r\nOctangle', 10], ['Blue', 'Rectangle\r\nTriangle', 15]]   
df = pd.DataFrame(data, columns = ['Color', 'Shape', 'Price'])
new_df = pd.DataFrame(columns = ['Color', 'Shape', 'Price'])

for index, row in df.iterrows():
    split = row['Shape'].split('\r\n')
    for shape in split:
        new_df = new_df.append(pd.DataFrame({'Color':[row['Color']], 'Shape':[shape], 'Price':[row['Price']]}))

new_df = new_df.reset_index(drop=True)
print(new_df)

Вывод:

   Color Price      Shape
0  Green    10  Rectangle
1  Green    10   Triangle
2  Green    10   Octangle
3   Blue    15  Rectangle
4   Blue    15   Triangle
1 голос
/ 23 октября 2019

Как прокомментировано, полезно str.split(), за которым следует explode. Если вы не используете Pandas 0.25, вы можете использовать melt впоследствии:

(pd.concat( (df.Shape.str.split('\r\n', expand=True), 
            df[['Color','Price']]),
          axis=1)
   .melt(id_vars=['Color', 'Price'], value_name='Shape')
   .dropna()
)

Вывод:

   Color  Price variable      Shape
0  Green     10        0  Rectangle
1   Blue     15        0  Rectangle
2  Green     10        1   Triangle
3   Blue     15        1   Triangle
4  Green     10        2   Octangle
0 голосов
/ 23 октября 2019

Во-первых, вам нужно разделить фигуру на пустые места, что даст вам список фигур. Затем используйте df.explode, чтобы распаковать список и создать новые строки для каждой из них

df["Shape"] = df.Shape.str.split()
df.explode("Shape")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...