我有各种类型的标志数组:
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'
但这似乎没有给我预期的结果。
编辑: 我可以使用pandas数据帧,每行只有1种类型,Type1,Type2,Type3
EDIT2: 数据类型1类型2类型3是pandas数据帧中的列名,但我使用的是带有隐式名称的numpy数组,如上面的示例所示。
答案 0 :(得分:2)
更新:这里混合了a brilliant @Divakar's idea使用DataFrame.idxmax(1)方法并使用set_index()
和reset_index()
来摆脱{ {1}}:
pd.concat()
OLD回答:
你可以这样做(熊猫解决方案):
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
答案 1 :(得分: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
行 -
<nav class="navbar navbar-toggleable-md navbar-light bg-faded">
<div class="collapse navbar-collapse" id="navbarSupportedContent">
// first line
</div>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
// second line
</div>
</nav>
示例运行 -
book
答案 2 :(得分: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