我有一个pyspark数据帧,如下所示:
以及以下国家的名单:
EU_countries=['西班牙','意大利','法国','德国']
我想做以下工作:
tmp\u列表中提取所有唯一值
EU\u国家/地区中存在的所有值创建新列
。对于EU\u国家中不存在的值
,创建一个名为other\u countries
的列。基本上,为EU\u国家中的每个条目创建列
列出一个名为other\u countries
的额外列
id
包含EU_国家
列表中的任何国家,则新列西班牙
应具有1
作为值,否则0
。这同样适用于EU_国家
列表中的其他国家
id
包含EU\u国家列表中不存在的任何国家,则应填写other\u countries
列1
else0
这是我想要的最终输出:
我为这件事伤了脑筋。谁能帮我一下吗?
任何帮助都非常感谢!非常感谢你!
推理和工作,就像我在熊猫里一样。
下面的代码;
df=df.select('*').withColumn('tmp_list1', F.explode(col('tmp_list')))#Create new column with exploded list
df=df.select('*').withColumn('Cat', when(col('tmp_list1').isin(EU_countries),df.tmp_list1).otherwise('other_countries'))#Create another column Cat
df.groupBy("tmp_list",'other features').pivot("Cat").agg(F.lit(1)).na.fill(0).show()#Get dummies
+---------------------------+--------------+------+-------+-----+-----+---------------+
|tmp_list |other features|France|Germany|Italy|Spain|other_countries|
+---------------------------+--------------+------+-------+-----+-----+---------------+
|[Spain, Germany] |zzz |0 |1 |0 |1 |0 |
|[Spain, Italy] |xxx |0 |0 |1 |1 |0 |
|[Spain, France, USA, India]|yyy |1 |0 |0 |1 |1 |
+---------------------------+--------------+------+-------+-----+-----+---------------+
步骤1:用常量字符串替换tmp_列表中的所有非欧盟国家:
from pyspark.sql import functions as F
df = ...
EU_countries = ['Spain', 'Italy', 'France', 'Germany']
def replaceNonEU(c):
cond = c == EU_countries[0]
for country in EU_countries[1:]:
cond |= (c == country)
return F.when(cond, c).otherwise(F.lit("other_countries"))
df = df.withColumn("tmp_list", F.array_distinct(F.transform("tmp_list", replaceNonEU)))
#+---+--------------------------------+--------------+
#|id |tmp_list |other features|
#+---+--------------------------------+--------------+
#|1 |[Spain, Italy] |xxx |
#|2 |[Spain, France, other_countries]|yyy |
#|3 |[Spain, Germany] |zzz |
#+---+--------------------------------+--------------+
步骤2:为
tmp_list
中的每个可能值创建一个新列,指示该值是否是tmp_list
的元素:
for c in EU_countries + ['other_countries']:
df = df.withColumn(c, F.array_contains("tmp_list", c).cast("int"))
df = df.drop("tmp_list")
#+---+--------------+-----+-----+------+-------+---------------+
#| id|other features|Spain|Italy|France|Germany|other_countries|
#+---+--------------+-----+-----+------+-------+---------------+
#| 1| xxx| 1| 1| 0| 0| 0|
#| 2| yyy| 1| 0| 1| 0| 1|
#| 3| zzz| 1| 0| 0| 1| 0|
#+---+--------------+-----+-----+------+-------+---------------+
我有一个这样的文本文件: 输入文件中的最后一个字段的长度为50k个字符,并且只有0、1或2个字符。我想要最后一个字段的一个热编码版本。因此,我的预期结果是这样的数据帧: 我通过读取输入文件创建了一个初始数据帧: 这将创建一个包含3列的数据帧: 我想我也许可以使用下面的东西创建初始的单独列,然后使用熊猫get_dummies函数进行一次热编码,但是我无法创建单独的列。我已经试过了 但这并不是把角色分
我有: 我想要: 似乎在scala中我可以写:< code>df.select($"value。_1 ",$ "值。_2 ",$ "值。_3"),但这在python中是不可能的。 那么有没有好的办法呢?
我的问题是如何将一列拆分为多个列。我不知道为什么 不起作用。 例如,我想将“df_test”更改为“df_test2”。我看到了很多使用熊猫模块的例子。还有别的办法吗?提前感谢您。 df_test2
感兴趣的是在同一pyspark数据帧中将列表的这一列拆分为多列的scala-spark实现 给定该数据帧: 我想要一个新的数据帧,它包含分解值并映射到我提供的列名称: 尝试: 但它的格式错误,我不知道如何映射到我的 colNames 列表: 在上面的链接中,python的解决方案是使用列表理解: 但它没有显示如何使用提供的列名列表,因为列名只是列的索引。
我有一个数据框架,它有一行和几列。有些列是单个值,有些是列表。所有列表列的长度相同。我想将每个列表列拆分为单独的行,同时保留任何非列表列。 样本DF: 我想要什么: 如果我只有一个列表列,那么只需执行< code>explode就很容易了: 然而,如果我尝试分解<code>c</code>列,我得到的数据帧长度为我想要的平方: 我想要的是-对于每一列,取该列中数组的第n个元素,并将其添加到新行。我
我有一个Pandas DataFrame列,其中包含一个列表中的多个列表。类似于这样: 我想将列表拆分为多列,因此输出应该是这样的: 请帮我做这件事。预先感谢