【发布时间】:2019-10-19 03:57:29
【问题描述】:
嘿嘿,
我有一个包含 2 列的源文件:ID 和 all_dimensions。所有维度都是具有不同“键值”对的字符串,每个 id 都不相同。 我想制作键列标题并解析相应的值(如果存在于正确的单元格中)。
示例:
ID all_dimensions
12 Height:2 cm,Volume: 4cl,Weight:100g
34 Length: 10cm, Height: 5 cm
56 Depth: 80cm
78 Weight: 2 kg, Length: 7 cm
90 Diameter: 4 cm, Volume: 50 cl
想要的结果:
ID Height Volume Weight Length Depth Diameter
12 2 cm 4cl 100g - - -
34 5 cm - - 10cm - -
56 - - - - 80cm -
78 - - 2 kg 7 cm - -
90 - 50 cl - - - 4 cm
我确实有超过 100 个维度,所以理想情况下,我想编写一个 for 循环或类似的东西,以不指定每个列标题(参见下面的代码示例) 我正在使用 Python 3.7.3 和 pandas 0.24.2。
我已经尝试了什么:
1) 我尝试将数据拆分为单独的列,但不确定如何继续将每个值分配到正确的标题中:
df.set_index('ID',inplace=True)
newdf = df["all_dimensions"].str.split(",|:",expand = True)
2) 使用初始 df,我使用“str.extract”创建新列(但随后我需要指定每个标题):
df['Volume']=df.all_dimensions.str.extract(r'Volume:([\w\s.]*)').fillna('')
3) 为了解决 2) 每个标题的问题,我创建了一个所有维度属性的列表,并考虑使用带有 for 循环的列表来提取值:
columns_list=df.all_dimensions.str.extract(r'^([\D]*):',expand=True).drop_duplicates()
columns_list=columns_list[0].str.strip().values.tolist()
for dimension in columns_list:
df.dimension=df.all_dimensions.str.extract(r'dimension([\w\s.]*)').fillna('')
在这里,JupyterNB 给了我一个 UserWarning:“Pandas 不允许通过新属性名称创建列”并且 df 看起来和以前一样。
【问题讨论】:
-
感谢 WeNYoBen 编辑示例数据格式!
-
对于警告,将:
trial.dimension更改为trial['dimension']。
标签: python-3.x string pandas dataframe extract