在pandas数据框中将一列转换为多列

yftpprvb  于 2023-05-21  发布在  其他
关注(0)|答案(4)|浏览(186)

乍一看,我认为编写一个解析来完成这项工作是小菜一碟。
但是后来我让自己陷入了一个很深的兔子洞,似乎不可能出去,调查什么是在python中操作字符串,集合和列表的最佳技术。
在Pandas中将一个 Dataframe 的一列转换为多列有那么难吗?
Source是一个包含3列的CSV文件,如下所示:file,coords,areas 0001.png,['181.5; 339.5','236.54166666666666; 201.583333……]、[136.0、153.0、44.5、43.0、57.5、68.0、153.0、……
导入CSV文件后,将其导入pandas dataframe。第二列和第三列被指定为Series类型

print('type:', type(df1.x_y_coords))
print('type:', type(df1.area))

type: <class 'pandas.core.series.Series'>
type: <class 'pandas.core.series.Series'>

列坐标和区域必须拆分为多个列,其中系列的每个元素(即python列表)必须成为 Dataframe 的列
如静态示例中所示

df = pd.DataFrame(columns=['file','coords','areas'])

...(列的变换)...

df = pd.DataFrame(columns=['file','c1','c2','c3','c4',...,'a1','a2','a3','a4',...])

另一个挑战是列将根据原始列的长度而变化的事实:坐标和面积。也就是说,一个文件可以有8个坐标和8个区域,而另一个文件可能有14个坐标和14个区域。
以便可以用null填充空列。
坐标和面积的长度始终相同。实际上,它们是平面图中图形的坐标和面积。
在Pandas中将这些列转换为 Dataframe 的多列的最佳技术是什么?

x6h2sr28

x6h2sr281#

您可以通过执行merge + apply(pd.Series)来完成您想要的操作

df.merge(df.x_y_coords.apply(pd.Series),
         left_index=True, 
         right_index=True)

但是,在加载到DataFrame之前,似乎需要解析它。
使用的样本数据:

df = pd.DataFrame({'frame': ['0001.png', '0002.png'],
              'x_y_coords': [ ['1.0', '2.0', '3.0'],
                              ['4.0', '5.0']]})
aamkag61

aamkag612#

import pandas as pd
df = pd.DataFrame({
    "file": "0001.png",
    "coords": [["181.5;339.5", "236.54166666666666", "201.583333"]],
    "areas": [[136.0, 153.0, 44.5]]}
)
df[[f'a{i}' for i, _ in enumerate(df['areas'].iloc[0])]] = pd.DataFrame(df['areas'].to_list(), index=df.index)
df[[f'c{i}' for i, _ in enumerate(df['coords'].iloc[0])]] = pd.DataFrame(df['coords'].to_list(), index=df.index)
gmol1639

gmol16393#

IIUC,您可以用途:

def h_explode(df, cols):
    for col in cols:
        df = df.join(pd.DataFrame(df.pop(col).tolist())
                               .rename(lambda x: f"{col[0]}{x+1}", axis=1))
    return df

out = df.pipe(h_explode, ["coords", "areas"])

输出:

print(out)

       file                   c1          c2          c3     a1     a2     a3
0  0001.png          181.5;339.5  236.541666  201.583333  136.0  153.0   44.5
1  0002.png  232.22727;47.818183        None        None   54.5   73.0  160.5
  • 使用的输入:*
df = pd.DataFrame({
    "file": ["0001.png", "0002.png"],
    "coords": [["181.5;339.5", "236.541666", "201.583333"], ["232.22727;47.818183"]],
    "areas": [[136.0, 153.0, 44.5], [54.5, 73.0, 160.5]]}
)
0pizxfdo

0pizxfdo4#

Series.str.split()似乎是最好的选择!
我尝试了以下命令行:

df_coords = df1['x_y_coords'].apply(lambda x: pd.Series(str(x).replace('[', '').replace(']', '').replace('\'','').replace(' ', '').split(',')))
df_coords

它返回以下 Dataframe :

而现在,它只是一个清理、重命名和合并的问题。
我在下面的文档中找到了很好的资源信息:
https://sparkbyexamples.com/pandas/pandas-split-column/#:~:text = In%20Pandas%2C%20the%20apply(),to%20split%20into%20two%20columns.
感谢您的快速反馈!像往常一样!)最好的祝愿

相关问题