Python 如何通过删除从同一行检索的值来转换数组列

Python 如何通过删除从同一行检索的值来转换数组列,python,pandas,Python,Pandas,假设我有一个数据框,其中有一列第一个\u名称(字符串)和另一列名称(数组)。如何对name_variations数组执行列操作,以便删除数组中包含的与first_name字段值匹配的任何值 例如,以下是初始数据帧: data = {'first_name': ['Robert', 'Richard', 'Joseph'], 'name_variations': [np.array(['Robert', 'R

假设我有一个数据框,其中有一列
第一个\u名称
(字符串)和另一列
名称
(数组)。如何对name_variations数组执行列操作,以便删除数组中包含的与first_name字段值匹配的任何值

例如,以下是初始数据帧:

data = {'first_name':  ['Robert',
                    'Richard',
                    'Joseph'],
    'name_variations': [np.array(['Robert', 'Rob', 'Bob']),
                        np.array(['Rich', 'Richard', 'Rick']),
                        np.array(['Joe'])],
    }

df = pd.DataFrame (data, columns = ['first_name','name_variations'])
这将产生如下数据帧:

  first_name        name_variations
0     Robert     [Robert, Rob, Bob]
1    Richard  [Rich, Richard, Rick]
2     Joseph                  [Joe]
我想对其进行转换,以便从name_variation的前两个值(基于first_name列)中删除Robert和Richard,但第三个值保持不变

期望输出:

  first_name name_variations
0     Robert      [Rob, Bob]
1    Richard    [Rich, Rick]
2     Joseph           [Joe]
在Chris对原始问题的正确回答后编辑问题。我应该在我的问题中提到,我的数据帧相当大(100万行),我想看看是否可以进行矢量化操作,而不是使用apply,后者速度较慢

df['name_variations'] = df.apply(lambda row: [x for x in row['name_variations'] if x!= row['first_name']], axis=1)


下面是一种使用
分解的方法:

df['name_variations'] = (df.explode('name_variations')
                           .query('first_name != name_variations')
                           .groupby(level=0)['name_variations']
                           .agg(list))
输出:

  first_name name_variations
0     Robert      [Rob, Bob]
1    Richard    [Rich, Rick]
2     Joseph           [Joe]

使用嵌套列表理解的另一种方法

df['name_variations'] = [[i for i in x if (i != df['first_name']).all()] for x in df['name_variations']]
时间:

%timeit df['name_variations'] = df.explode('name_variations').query('first_name != name_variations').groupby(level=0)['name_variations'].agg(list)
10.1 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.apply(lambda row: [x for x in row['name_variations'] if x!= row['first_name']], axis=1)
2.33 ms ± 68.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df['name_variations'] = [[i for i in x if (i != df['first_name']).all()] for x in df['name_variations']]
1.67 ms ± 66.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

谢谢你,克里斯。你的答案是正确的,而且有效。我应该在我的问题中提到,我的数据帧相当大(100万行),我想看看是否可以进行矢量化操作,而不是使用应用程序,这会更慢。这个问题做得很好。易于重新创建数据帧,并清除所需的输出。
%timeit df['name_variations'] = df.explode('name_variations').query('first_name != name_variations').groupby(level=0)['name_variations'].agg(list)
10.1 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.apply(lambda row: [x for x in row['name_variations'] if x!= row['first_name']], axis=1)
2.33 ms ± 68.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df['name_variations'] = [[i for i in x if (i != df['first_name']).all()] for x in df['name_variations']]
1.67 ms ± 66.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)