我的数据集中有一列具有以下格式:
'XX4H30M'
我需要将这些序列中的数字提取到两列(' H'和' M)。
如果格式完全如上所述,以下(在熊猫中)可以满足我的需要:
d3 = df.colname.str.extract('([0-9])([0-9])', expand=True)
d3.columns = ['H', 'M']
df = pd.concat([df, d3])
但是,本系列中的大量单元格只包含
'XX45M'
XX3H
有没有办法可选地提取这些模式以将它们插入到全局df中?
对于一组具体的例子:
df = pd.DataFrame({'A': ['XX1H30M', 'XX45M', 'XX2H'])
最终会成为
Out:
A H M
0 XX1H30M 1 30
1 XX45M 0 45
2 XX2H 2 0
使用
在pandas中可以实现我所需要的df = df.assign(H=recipes.col.str.extract('([0-9]+)H', expand=False),
M=recipes.col.str.extract('([0-9]+)M', expand=False)).fillna(0)
您可以拆分列,并在pyspark中添加新列:
split_col = pyspark.sql.functions.split(df['col'], '-')
df = df.withColumn('H', split_col.getItem(0))
df = df.withColumn('M', split_col.getItem(1))
如何将此扩展到我的情况(例如' XX2H45M'有两列的模式?
答案 0 :(得分:2)
在pyspark中,您可以使用regexp_extract
:
df = spark.createDataFrame(pd.DataFrame({'A': ['XX1H30M', 'XX45M', 'XX2H']}))
import pyspark.sql.functions as psf
df.withColumn("H", psf.regexp_extract("A", "([0-9]+)H", 1))\
.withColumn("M", psf.regexp_extract("A", "([0-9]+)M", 1))\
.show()
+-------+---+---+
| A| H| M|
+-------+---+---+
|XX1H30M| 1| 30|
| XX45M| | 45|
| XX2H| 2| |
+-------+---+---+
答案 1 :(得分:0)
我刚刚将pyspark RDD变成了一个带有' toPandas'的pandas数据帧。并使用了pandas命令:
df = df.assign(H=recipes.col.str.extract('([0-9]+)H', expand=False),
M=recipes.col.str.extract('([0-9]+)M', expand=False)).fillna(0)