2017-03-09 101 views
2

我有标志的各种类型的数组为:创建字符串数组

Data Type1 Type2 Type3 
12 1  0  0 
14 0  1  0 
3 0  1  0 
45 0  0  1 

我想创建下面的数组:

Data TypeName 
12 Type1 
14 Type2 
3 Type2 
45 Type3 

我试图创建一个类型为字符串的空数组:

import numpy as np 
z1 = np.empty(4, np.string_) 
z1[np.where(Type1=1)] = 'Type1' 

但是,这似乎并没有给我想要的结果。

编辑: 我可以使用熊猫数据帧和每行仅具有1型或者类型1,类型2,类型3

EDIT2: 数据类型1类型2类型3是列名中熊猫数据帧,但我使用具有numpy的阵列隐含的名字,正如我在上面的例子中指出的那样。

+1

输入是否是熊猫数据框?从第二列开始,每行总是只有一个“1”? – Divakar

+0

你能告诉我们如何创建这样一个输入数组? – Divakar

回答

2

这里的滥用事实是,我们有一个确切的1每行从Type1柱开始idxmax()的方法得到它每行的唯一发生 -

pd.concat((df.Data, df.iloc[:,1:].idxmax(1)),axis=1) 

运行示例 -

In [42]: df 
Out[42]: 
    Data Type1 Type2 Type3 
0 12  1  0  0 
1 14  0  1  0 
2  3  0  1  0 
3 45  0  0  1 

In [43]: pd.concat((df.Data, df.iloc[:,1:].idxmax(1)),axis=1) 
Out[43]: 
    Data  0 
0 12 Type1 
1 14 Type2 
2  3 Type2 
3 45 Type3 
+1

我真的很喜欢这个解决方案。其实你不需要'pd.concat' - ''df.set_index('Data')。idxmax(1).reset_index(name ='TypeName')' – MaxU

2

UPDATE:这里是a brilliant @Divakar's idea混合使用DataFrame.idxmax(1)方法和使用set_index()reset_index()为了摆脱pd.concat()

In [142]: df.set_index('Data').idxmax(1).reset_index(name='TypeName') 
Out[142]: 
    Data TypeName 
0 12 Type1 
1 14 Type2 
2  3 Type2 
3 45 Type3 

OLD答案:

你可以做就这样(Pandas解决方案):

In [132]: df.set_index('Data') \ 
      .stack() \ 
      .reset_index(name='val') \ 
      .query("val == 1") \ 
      .drop('val', 1) 
Out[132]: 
    Data level_1 
0  12 Type1 
4  14 Type2 
7  3 Type2 
11 45 Type3 
要做到这一点
+0

您应该将您的建议添加到您的帖子中。我认为在你的文章中值得一提! – Divakar

+0

@Divakar,但这里的主要想法是使用'.idxmax(1)' - 而你是第一个...;) – MaxU

+1

链接到我的文章!但是请加! :) – Divakar

1

一种方式是通过

df.apply(lambda row: 'Type1' if row.Type1 else 'Type2' if row.Type2 else 'Type3', axis=1) 

例如:

In [6]: df 
Out[6]: 
    Data Type1 Type2 Type3 
0 12  1  0  0 
1 14  0  1  0 
2  3  0  1  0 
3 45  0  0  1 

In [7]: df['TypeName'] = df.apply(lambda row: 'Type1' if row.Type1 else 'Type2' if row.Type2 else 'Type3', axis=1) 

In [9]: df.drop(['Type1', 'Type2', 'Type3'], axis=1) 
Out[9]: 
    Data TypeName 
0 12 Type1 
1 14 Type2 
2  3 Type2 
3 45 Type3