[英]Create df columns based on an existing df column that contains delimiters
我的 pandas df
的一列看起来像这样。 它是一个带有-
作为分隔符的长字符串。 这个长字符串包含特定产品的一些特征。
Water Resistant: 10 ATM - Diameter: 48 mm - Sex: Man - Material: RVS IP Gun - Movement: Quartz - Functionality: Alleen Tijd - Glass: Mineraal
我想为每个 object 特性在相同的df
中创建列:防水、直径、性别等。
最终结果应类似于:
Water resistance Diameter Sex Material Movement
10 ATM 48 mm Man RVS IP Gun Quartz
还有一些产品没有描述。 在这种情况下, df
应该如下所示:
Water resistance Diameter Sex Material Movement
10 ATM 48 mm Man RVS IP Gun Quartz
- 47 mm Woman - Quartz
10 ATM - Woman UIS -
我怎样才能做到这一点?
使用正则表达式和pd.DataFrame.from_records
。
前任:
import re
s = "Water Resistant: 10 ATM - Diameter: 48 mm - Sex: Man - Material: RVS IP Gun - Movement: Quartz - Functionality: Alleen Tijd - Glass: Mineraal"
ptrn = re.compile(r"([\w\s]+):\s*([\w\s]+)")
df = pd.DataFrame.from_records([dict(ptrn.findall(s))])
print(df)
Output:
Water Resistant Diameter Sex Material Movement Functionality Glass
0 10 ATM 48 mm Man RVS IP Gun Quartz Alleen Tijd Mineraal
我假设你有这个 dataframe:
col1
0 Water Resistant: 10 ATM - Diameter: 48 mm - Se...
1 Diameter: 47 mm - Sex: Woman - Movement: Quart...
2 Water Resistant: 13 ATM - Sex: Woman - Materia...
然后:
df_out = pd.DataFrame(
df["col1"]
.apply(
lambda x: {
line.split(":")[0]: line.split(":")[1].strip()
for line in x.split(" - ")
}
)
.tolist()
).fillna("-")
print(df_out)
印刷:
Water Resistant Diameter Sex Material Movement Functionality Glass
0 10 ATM 48 mm Man RVS IP Gun Quartz Alleen Tijd Mineraal
1 - 47 mm Woman - Quartz Alleen Tijd Mineraal
2 13 ATM - Woman UIS - Alleen Tijd Mineraal
编辑:处理NaN
和边缘情况:
def fn(x):
if pd.isna(x):
return {}
out = {}
for line in x.split(" - "):
if ":" in line:
k, v = map(str.strip, line.split(":"))
out[k] = v
return out
df_out = pd.DataFrame(df["col1"].apply(fn).tolist()).fillna("-")
print(df_out)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.