Python np.select将一些条件匹配到多个选项上

1 人关注

我有一个pandas数据框架,像这样。

id variable value
1    x        5
1    y        5
2    x        7
2    y        7

现在我想把一些变量重命名为其他的东西,对于其他的变量,我想把它们映射到两个不同的变量(其余的行将被复制成原样)。例如,在上述数据框架中,我想把x重命名为x1,把y重命名为ab。我正在寻找类似这样的东西。

conditions = [(df['variable']=='x'),(df['variable']=='y')]
choices = ['x1',['y1','y2']]
df['variable'] = np.select(conditions, choices, default='NA')

因此,最终的数据框架将是这样的。

id variable value
1    x1       5
1    a        5
1    b        5
2    x1       7
2    a        7
2    b        7

我怎样才能实现这个目标?

python
pandas
numpy
dataframe
Ank
Ank
发布于 2020-06-24
1 个回答
anky
anky
发布于 2020-06-24
已采纳
0 人赞同

你正试图改变数据的形状,你可以尝试这种方法,用一个分隔符连接列表,然后我们可以爆炸列和连接。

conditions = [(df['variable']=='x'),(df['variable']=='y')]
s=pd.Series(np.select(conditions,['x1','|'.join(['a','b'])])).str.split('|').explode()
out = df.join(s.rename("variable_new"))
print(out)
   id variable  value variable_new
0   1        x      5           x1
1   1        y      5            a
1   1        y      5            b
2   2        x      7           x1
3   2        y      7            a
3   2        y      7            b

EDIT适用于低于0.25的pandas版本。

conditions = [(df['variable']=='x'),(df['variable']=='y')]
df['variable'] = (pd.Series(np.select(conditions,
                 ['x1','|'.join(['a','b'])])).str.split('|'))
out = (df.loc[df.index.repeat(df['variable'].str.len())]
       .assign(variable=np.concatenate(df['variable'])))
print(out)
   id variable  value
0   1       x1      5
1   1        a      5