将列表元素作为列添加到现有的pyspark datafram

2024-04-18 04:12:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个清单lists=[0,1,2,3,5,6,7]。顺序不是顺序的。我有一个有9列的pyspark数据帧。在

+-------------------+--------+--------+--------+--------+--------+--------+---------------+-----+----+
|               date|ftt (°c)|rtt (°c)|fbt (°c)|rbt (°c)|fmt (°c)|rmt (°c)|fmhhumidityunit|index|Diff|
+-------------------+--------+--------+--------+--------+--------+--------+---------------+-----+----+
|2019-02-01 05:29:47|     NaN|     NaN|     NaN|     NaN|     NaN|     NaN|            NaN|    0| NaN|
|2019-02-01 05:29:17|     NaN|     NaN|     NaN|     NaN|     NaN|    NaN|           NaN|    1| NaN |

我需要将列表作为列添加到现有的数据帧中。我的列表不整齐,所以我不能使用自定义项。有办法吗?。请帮帮我 我想变成这样

^{pr2}$

Tags: 数据rtt列表dateindex顺序nanlists
2条回答

不太确定是一定是这样的,还是你期待着别的什么。 如果列表项和数据帧行的数量必须相同,那么这里有一个简单的方法。在

对于具有三列的给定示例数据帧:

 l = [(1,'DEF',33),(2,'KLM',22),(3,'ABC',32),(4,'XYZ',77)]
 df=spark.createDataFrame(l, ['id', 'value','age'])

假设这是一个列表:

^{pr2}$

可以从这个列表创建rdd,并对dataframe使用zip函数,并在其上使用map函数。在

listrdd = sc.parallelize(lists)

newdf=df.rdd.zip(listrdd).map(lambda (x,y ) : ([x for x in x] + [y])).toDF(["id", "Value",",age","List_element"])

>>> ziprdd=df.rdd.zip(listrdd)
>>> ziprdd.take(50)
[(Row(id=1, value=u'DEF', age=33), 5), (Row(id=2, value=u'KLM', age=22), 6), (Row(id=3, value=u'ABC', age=32), 7), (Row(id=4, value=u'XYZ', age=77), 8)]

作为zip函数,返回具有第一个元素的键值对包含来自第一个rdd的数据,而第二个元素包含来自第二个rdd的数据。 我对第一个元素使用列表理解,并将其与第二个元素连接起来。在

它是动态的,可以用于n个列,但列表元素和数据帧行必须相同。在

>>> newdf.show()
]+ -+  -+  +      +
| id|Value|,age|List_element|
+ -+  -+  +      +
|  1|  DEF|  33|           5|
|  2|  KLM|  22|           6|
|  3|  ABC|  32|           7|
|  4|  XYZ|  77|           8|
+ -+  -+  +      +

注意:使用zip方法时,两个rdd分区计数必须相同,否则将出现错误

ValueError: Can only zip with RDD which has the same number of partitions

您可以join两个df,如下所示:

df2 = spark.createDataFrame()
df= df.join(df2, on=['index']).drop('index')

df2将包含您希望添加到主df中的列。在

相关问题 更多 >