我已经看到了许多关于将条件列添加到数据框的问题,这些条件列通常依赖于使用np.where()
。据我所知,np.where()
仅在附加的同一行中查找。例如:
# Create df with 3 columns of random numbers from 0 to 100
df = pd.DataFrame(np.random.randint(0,100,size=(3, 3)), columns=list('ABC'))
---------------
A B C
23 16 85
9 74 12
99 24 83
---------------
# Add new column based on values in other columns
conditions = [
(df['A'] == 9),
(df['B'] == 16)),
(df['A'] == 99) & (df['C'] == 83)]
choices = ['Good', ' Better', 'Best']
df['How_Good'] = np.select(conditions, choices, default='Awful')
---------------
A B C How_Good
23 16 85 Better
9 74 12 Good
99 24 83 Best
---------------
在这种情况下,新列的值直接对应于同一行中其他列的值。
但是,我想产生一列,其值取决于特定列中的任何值。例如,假设我有一个这样的df:
d = {'ID': [1, 2, 3], 'Name': ['Al', 'Mo', 'Q'],
'Owned': ['Car', 'Truck', 'Bike'],
'ID_1': [5, 7, 1], 'Name_1':['Jo', 'Ry', 'We']}
df = pd.DataFrame(data=d)
------------
ID Name Owned ID_1 Name_1
1 Al Car 5 Jo
2 Mo Truck 7 Ry
3 Q Bike 1 We
------------
现在,我想添加另一列Match
,该列在Owned
时显示ID_1 == ID
的值,但不一定在同一行中。基本上,它必须对照ID
中的每个值检查ID_1
并在找到匹配项后停止。因此,带有附加列的df如下所示:
------------
ID Name Owned ID_1 Name_1 Match
0 1 Al Car 5 Jo nan
1 2 Mo Truck 7 Ry nan
2 3 Q Bike 1 We Car
------------
在上面的示例中,第0行中的ID
与第2行中的ID_1
匹配(没有其他匹配项)。然后,它从第0行获取了Owned
的值并将其放入Match
。因此,新列Match
在整个数据帧中寻找ID
和ID_1
之间的匹配项。如果为真,则将Owned
中的值放入Match
中,否则放入nan
中。
需要注意的是,Owned
下只有一定数量的东西:它只能是汽车,卡车或自行车。但是ID
和ID_1
可以重复很多次。 ID_2
,ID_3
还有更多列,依此类推,所有这些列在ID
上匹配,并使用Owned
中的值。
答案 0 :(得分:2)
您可以按以下方式使用DataFrame.apply
:
df['Match'] = df.apply(lambda row: df[df['ID'] == row['ID_1']].loc[:, 'Owned'], axis=1)
如果您有更复杂的条件,则可能需要将它们放入函数中,然后应用它。
答案 1 :(得分:2)
您可以使用merge
:
df.merge(df[['Name','ID']].rename(columns={'Name':'Match',
'ID':'ID_1'}),
on='ID_1',
suffixes=['','_re'],
how='left')
输出:
ID Name Owned ID_1 Name_1 Match
0 1 Al Car 5 Jo NaN
1 2 Mo Truck 7 Ry NaN
2 3 Q Bike 1 We Al
答案 2 :(得分:1)
使用完整的数据,您可以使用循环对此进行扩展:
df.loc[2,'Match'] = df.loc[df.loc[2].ID_1-1].Owned
#Out[2615]:
# ID Name Owned ID_1 Name_1 Match
#0 1 Al Car 5 Jo NaN
#1 2 Mo Truck 7 Ry NaN
#2 3 Q Bike 1 We Car