如何使用 for 循环将列及其内容从 df 转换为 Python 上更有组织的列? Pandas 相关

How can I use for loops to convert the columns and its contents from a df to a more organized ones on Python? Pandas related

我得到以下 df 作为先前过程的结果,该过程使一些 Cartesian Products:

  Permutations                        FilePermutations
0 Fondo+Cuerpo+Ojos+Color+Pinzas+Puas Oceano.png+Cuerpo_cangrejo.png+Antenas.png+Amarillo.png+None+None
1 Fondo+Cuerpo+Ojos+Color+Pinzas+Puas Oceano.png+Cuerpo_cangrejo.png+Antenas.png+Amarillo.png+None+Arena.png
2 Fondo+Cuerpo+Ojos+Color+Pinzas+Puas Oceano.png+Cuerpo_cangrejo.png+Antenas.png+Amarillo.png+None+Marron.png
3 Fondo+Cuerpo+Ojos+Color+Pinzas+Puas Oceano.png+Cuerpo_cangrejo.png+Antenas.png+Amarillo.png+None+Purpura.png
4 Fondo+Cuerpo+Ojos+Color+Pinzas+Puas Oceano.png+Cuerpo_cangrejo.png+Antenas.png+Amarillo.png+None+Verde.png
.
.
.

我想将那个 df 转换成这个,其中每个 "_" 变成 " " 并且单词末尾的每个 ".png" 都被删除了:

0 | Fondo | Oceano | Cuerpo | Cuerpo cangrejo | Ojos | Antenas | Color | Amarillo | Pinzas | None | Puas | None
1 | Fondo | Oceano | Cuerpo | Cuerpo cangrejo | Ojos | Antenas | Color | Amarillo | Pinzas | None | Puas | Arena
2 | Fondo | Oceano | Cuerpo | Cuerpo cangrejo | Ojos | Antenas | Color | Amarillo | Pinzas | None | Puas | Marron
3 | Fondo | Oceano | Cuerpo | Cuerpo cangrejo | Ojos | Antenas | Color | Amarillo | Pinzas | None | Puas | Purpura
4 | Fondo | Oceano | Cuerpo | Cuerpo cangrejo | Ojos | Antenas | Color | Amarillo | Pinzas | None | Puas | Verde
.
.
.

我试过下面的代码:

import pandas as pd

old_df = pd.read_csv("cartesian.csv", index_col=0)
new_columns = old_df.iloc[0]['Permutations'].split("+")
new_data = []
for i in range(0, len(old_df)):
    row_data = old_df.iloc[i]['FilePermutations'].split("+")
    current_data = []
    for j, column in enumerate(new_columns):
        current_data.append(f"{column} {row_data[j]}")
    new_data.append(current_data)

updated_df = pd.DataFrame(data=new_data, columns=new_columns)
print(updated_df)

但只得到了这个 new_df:

              Fondo                      Cuerpo  ...       Pinzas              Puas
0  Fondo Oceano.png  Cuerpo Cuerpo_cangrejo.png  ...  Pinzas None         Puas None
1  Fondo Oceano.png  Cuerpo Cuerpo_cangrejo.png  ...  Pinzas None    Puas Arena.png
2  Fondo Oceano.png  Cuerpo Cuerpo_cangrejo.png  ...  Pinzas None   Puas Marron.png
3  Fondo Oceano.png  Cuerpo Cuerpo_cangrejo.png  ...  Pinzas None  Puas Purpura.png
4  Fondo Oceano.png  Cuerpo Cuerpo_cangrejo.png  ...  Pinzas None    Puas Verde.png
..                                          ...  ...                            ...

[360 rows x 6 columns]

我可以得到一些帮助吗?

使用Series.str.split and df.replace with pd.concat:

In [415]: res = pd.concat([df.Permutations.str.split('+', expand=True), df.FilePermutations.str.split('+', expand=True)], 1).replace({'_': ' ', '.png': ''}, regex=True)

In [416]: res
Out[416]: 
       0       1     2      3       4     5       0                1        2         3     4        5
0  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None     None
1  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None    Arena
2  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None   Marron
3  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None  Purpura
4  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None    Verde

根据@mozway 的评论,避免使用 apply:

链接
In [451]: x = df.apply(lambda x: x.str.split('+'), 1)
In [452]: res = pd.concat([x[i].apply(pd.Series) for i in x], 1).replace({'_': ' ', '.png': ''}, regex=True)

In [453]: res
Out[453]: 
       0       1     2      3       4     5       0                1        2         3     4        5
0  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None     None
1  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None    Arena
2  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None   Marron
3  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None  Purpura
4  Fondo  Cuerpo  Ojos  Color  Pinzas  Puas  Oceano  Cuerpo cangrejo  Antenas  Amarillo  None    Verde