我有一个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
我目前正在使用以下代码检查节点是否在列表中(返回布尔值0
和1
)。
df['node'].isin(nodes).astype(int)
但是,如果有条件将数据划分为类别,我不确定如何做到。
如果需要,我很乐意提供矿石详细信息。
答案 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