在某些其他列的任意位置添加具有条件值的列

2024-06-01 18:45:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到了许多关于向数据帧添加条件列的问题,这些问题通常依赖于使用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,它在ID_1 == ID时显示Owned的值,但不一定在同一行中。基本上,它必须检查IDID_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在整个数据帧中寻找IDID_1之间的匹配。如果这是真的,它将值从Owned放入Match,否则nan。你知道吗

需要注意的是,在Owned下只有一定数量的东西:它只能是汽车、卡车或自行车。但是IDID_1都可以重复多次。还有更多的列用于ID_2ID_3等,所有这些列都在ID上匹配并使用Owned中的值。你知道吗


Tags: columnsnameiddfmatchnpcarmo
3条回答

您可以使用DataFrame.apply如下:

df['Match'] = df.apply(lambda row: df[df['ID'] == row['ID_1']].loc[:, 'Owned'], axis=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

您可以使用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

相关问题 更多 >