我有多索引映射规则,这是规则
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.MultiIndex
和pd.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上执行此操作
答案 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')