小编Pie*_*aud的帖子

sklearn.LabelEncoder以前从未见过的值

如果a sklearn.LabelEncoder已安装在训练集上,如果在测试集上使用时遇到新值,则可能会中断.

我能想到的唯一解决方案是将测试集中的所有新内容(即不属于任何现有类)映射到"<unknown>",然后在后面显式添加相应的类LabelEncoder:

# train and test are pandas.DataFrame's and c is whatever column
le = LabelEncoder()
le.fit(train[c])
test[c] = test[c].map(lambda s: '<unknown>' if s not in le.classes_ else s)
le.classes_ = np.append(le.classes_, '<unknown>')
train[c] = le.transform(train[c])
test[c] = le.transform(test[c])
Run Code Online (Sandbox Code Playgroud)

这有效,但有更好的解决方案吗?

更新

正如@sapo_cosmico在评论中指出的那样,似乎上面的内容不再适用,因为我认为是实现更改LabelEncoder.transform,现在似乎正在使用np.searchsorted(我不知道以前是否是这种情况).因此,不需要将<unknown>类附加到LabelEncoder已经提取的类的列表中,而是需要按排序顺序插入:

import bisect
le_classes = le.classes_.tolist()
bisect.insort_left(le_classes, '<unknown>')
le.classes_ = le_classes
Run Code Online (Sandbox Code Playgroud)

然而,总而言之,这感觉非常笨重,我确信有更好的方法.

python scikit-learn

57
推荐指数
7
解决办法
3万
查看次数

将大数组列拆分为多列-Pyspark

我有:

+---+-------+-------+
| id|   var1|   var2|
+---+-------+-------+
|  a|[1,2,3]|[1,2,3]|
|  b|[2,3,4]|[2,3,4]|
+---+-------+-------+
Run Code Online (Sandbox Code Playgroud)

我想要:

+---+-------+-------+-------+-------+-------+-------+
| id|var1[0]|var1[1]|var1[2]|var2[0]|var2[1]|var2[2]|
+---+-------+-------+-------+-------+-------+-------+
|  a|      1|      2|      3|      1|      2|      3|
|  b|      2|      3|      4|      2|      3|      4|
+---+-------+-------+-------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

如何在Pyspark中将列表拆分为多个列提供的解决方案

df1.select('id', df1.var1[0], df1.var1[1], ...).show()
Run Code Online (Sandbox Code Playgroud)

可以,但是我的一些数组很长(最大332)。

我该如何编写它以便考虑所有长度的数组?

pyspark

5
推荐指数
1
解决办法
946
查看次数

将 UDF 应用于 StructType 数组

我有一个具有以下架构的数据框:

root
 |-- urlA: string (nullable = true)
 |-- urlB: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- distCol: double (nullable = true)
 |    |    |-- url: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

我想使用 UDF 访问结构中的元素,以便可以对 distCol 值进行排序并获取 distCol 最小的 url(在 urlB 中)(实际上是前 N 个)

输入:

+--------------------+---------------------------------+
|                urlA|                             urlB|
+--------------------+---------------------------------+
|            some_url|[[0.02, url_0], [0.03, url_1],...|
+--------------------+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

输出(理想情况下):

+--------------------+------------------------------------+
|                urlA|                                urlB|
+--------------------+------------------------------------+
|            some_url|[[url_best_score_0, url_best_0],...]|
+--------------------+------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我的udf:

def rank_url(row_url):
    ranked_url = sorted(row_url[0], key=lambda x: x[0], …
Run Code Online (Sandbox Code Playgroud)

python user-defined-functions dataframe pyspark

5
推荐指数
1
解决办法
1万
查看次数

如何在PySpark的Dataframe中用逗号分隔的值拆分列?

我有一个PySpark数据框,其中包含一个包含逗号分隔值的列。该列包含的值的数量是固定的(例如4)。例:

+----+----------------------+
|col1|                  col2|
+----+----------------------+
|   1|val1, val2, val3, val4|
|   2|val1, val2, val3, val4|
|   3|val1, val2, val3, val4|
|   4|val1, val2, val3, val4|
+----+----------------------+
Run Code Online (Sandbox Code Playgroud)

在这里,我想将col2分成4个单独的列,如下所示:

+----+-------+-------+-------+-------+
|col1|  col21|  col22|  col23|  col24|
+----+-------+-------+-------+-------+
|   1|   val1|   val2|   val3|   val4|
|   2|   val1|   val2|   val3|   val4|
|   3|   val1|   val2|   val3|   val4|
|   4|   val1|   val2|   val3|   val4|
+----+-------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

dataframe pyspark

2
推荐指数
1
解决办法
2462
查看次数