2017-03-09 166 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