如何在python中向熊猫数据框添加多个标签

时间:2019-07-25 06:07:25

标签: python python-3.x pandas

我有一个pandas数据框和一个节点列表,如下所示。

     node     title     description
0  "node1"  "nn nn."  "nnnn nnnn"
1  "node2"  "mm mm."  "mmmm mmmm"
2  "node3"  "ll ll."  "llll llll"
3  "node4"  "jj jj."  "jjjj jjjj"

nodes = [["node4", 0.9], ["node2", 1.0], ["node3", 0.8]]

我想向数据框添加另一列,例如level

  • high表示节点的值高于0.8
  • med表示节点的值在0.8-0.6之间
  • low表示节点的值低于0.6
  • N/A表示该节点不在nodes列表中。

所以我的输出应如下所示。

     node     title     description  level
0  "node1"  "nn nn."  "nnnn nnnn"     N/A
1  "node2"  "mm mm."  "mmmm mmmm"     high
2  "node3"  "ll ll."  "llll llll"     med
3  "node4"  "jj jj."  "jjjj jjjj"     high

我目前正在使用以下代码检查节点是否在列表中(返回布尔值01)。

df['node'].isin(nodes).astype(int)

但是,如果有条件将数据划分为类别,我不确定如何做到。

如果需要,我很乐意提供矿石详细信息。

2 个答案:

答案 0 :(得分:1)

使用map映射list的值,并使用np.select映射条件的值:

s=df.node.map(dict(nodes))
df['level']=np.select([s.lt(.6),s.ge(0.6)&s.le(.8),s.gt(0.8)],['low','med','high'],'N/A')
print(df)

    node   title description level
0  node1  nn nn.   nnnn nnnn   N/A
1  node2  mm mm.   mmmm mmmm  high
2  node3  ll ll.   llll llll   med
3  node4  jj jj.   jjjj jjjj  high

请注意,如果df中的字符串包含",请使用df=df.applymap(lambda x: x.replace('"',''))

替换它们

答案 1 :(得分:1)

首先将列表转换为数据框

然后应用pd.merge

使用df.loc并应用条件

然后放下node_values

nodes = [["node4", 0.9], ["node2", 1.0], ["node3", 0.8]]
node_values = pd.DataFrame(nodes,columns=["node","node_value"])

df = pd.merge(df,node_values,on=['node'],how='left')
df.loc[(df['node_value']<=0.8) & (df['node_value']>=0.6),"level"] = "mid"
df.loc[(df['node_value']>0.8),"level"] = "high"
df.loc[(df['node_value']<0.6),"level"] = "low"

df.drop(['node_value'],axis=1,inplace=True)

    node   title description level
0  node1  nn nn.   nnnn nnnn   N/A
1  node2  mm mm.   mmmm mmmm  high
2  node3  ll ll.   llll llll   med
3  node4  jj jj.   jjjj jjjj  high