多索引分类并在PySpark中进行编码

时间:2018-08-13 13:56:00

标签: python pandas dataframe pyspark multi-index

我有多索引映射规则,这是规则

Type A: Chicken, Beef, Goat
Type B: Fish, Shrimp
Type C: Chicken, Pork

我这是我的数据框,可以说这是df数据框,并且想要进行多索引映射

   id   Menu
   1    Fried Chicken
   2    Shrimp Chips
   3    Pork with Cheese
   4    Fish Spaghetti
   5    Goat Sate
   6    Beef Soup

对于pandas,可以同时使用pd.MultiIndexpd.Series.str.get_dummies。因此,代码将是

from pandas import pd
from numpy.core.defchararray import find

m = {
    'Type A': ['Chicken', 'Beef', 'Goat'],
    'Type B': ['Fish', 'Shrimp'],
    'Type C': ['Chicken', 'Pork']
}

mux = pd.MultiIndex.from_tuples(
    [(k, v) for k, values in m.items() for v in values])

df.join(
    df.Menu.str.get_dummies(sep=' ') \
      .reindex(columns=mux, level=1).max(axis=1
, level=0)
)

输出将是这样

 id     Menu                 Type A   Type B   Type C
   1    Fried Chicken        1        0        1
   2    Shrimp Chips         0        1        0
   3    Pork with Cheese     0        0        1
   4    Fish Spaghetti       0        1        0
   5    Goat Sate            1        0        0
   6    Beef Soup            1        0        0

如何在pySpark datafarame上执行此操作

1 个答案:

答案 0 :(得分:1)

spark中没有标准的多索引。

您可以做的是检查您的字符串是否包含任何元素:

from pyspark.sql import functions as F

index_dict = {
    'Type A': ['Chicken', 'Beef', 'Goat'],
    'Type B': ['Fish', 'Shrimp'],
    'Type C': ['Chicken', 'Pork']
}

for col_name, values in index_dict.items():
    col = F.col('Menu').like('%'+values[0]+'%')
    for value in values[1:]:
        col2 = F.col('Menu').like('%'+value+'%')
        col = col | col2
    df = df.withColumn(col_name, col)

我认为如果您在知道分隔符时不检查整个字符串,则可能会更快。因此,您可以使用:

df = df.withColumn('tmp', F.split(df['Menu'], ' '))

F.col('Menu').like('%'...'%')替换为F.array_contains(F.col('tmp'), ...)

并以df = df.drop('tmp')

结尾