Python 有条件地替换数据帧中数组列表中的值

Python 有条件地替换数据帧中数组列表中的值,python,pandas,Python,Pandas,我希望有条件地替换包含一系列数组的列中的值 下面的示例数据集:(我的真实数据集包含更多的列和行) 例如,如果条件是A,并且行包含“1南瓜”,那么我想用XXX替换该值。但是如果条件是B,并且行包含1,那么我想用YYY替换该值 期望输出 index lists condition 0 ['5 apples', '2 pears'] B 1 ['3 apples', '3 pea

我希望有条件地替换包含一系列数组的列中的值

下面的示例数据集:(我的真实数据集包含更多的列和行)

例如,如果条件是
A
,并且行包含“1南瓜”,那么我想用
XXX
替换该值。但是如果条件是
B
,并且行包含
1
,那么我想用
YYY
替换该值

期望输出

index   lists                                  condition
0       ['5 apples', '2 pears']                B
1       ['3 apples', '3 pears', 'XXX']         A
2       ['4 blueberries']                      A
3       ['5 kiwis']                            C
4       ['YYY']                                B
...     ...                                    ...

实际上,目标是替换所有这些值,但
1
只是一个例子。重要的是,我想维护数组结构。谢谢

您可以使用要应用于
Dataframe
的逻辑定义函数,然后调用
df.apply(function)
将此逻辑传递给
df

def pumpkin(row):

    if '1 pumpkin' in row['lists']:
        data = row['lists'][:]
        if row['condition'] == 'A':
            data[data.index('1 pumpkin')] = 'XXX'
        elif row['condition'] == 'B':
            data[data.index('1 pumpkin')] = 'YYY'
        return data
    return row['lists']

df['lists'] = df.apply(pumpkin, axis=1)
输出

                      lists condition
0       [5 apples, 2 pears]         B
1  [3 apples, 3 pears, XXX]         A
2           [4 blueberries]         A
3                 [5 kiwis]         C
4                     [YYY]         B

您可以使用要应用于
Dataframe
的逻辑定义函数,然后调用
df.apply(function)
将此逻辑传递给
df

def pumpkin(row):

    if '1 pumpkin' in row['lists']:
        data = row['lists'][:]
        if row['condition'] == 'A':
            data[data.index('1 pumpkin')] = 'XXX'
        elif row['condition'] == 'B':
            data[data.index('1 pumpkin')] = 'YYY'
        return data
    return row['lists']

df['lists'] = df.apply(pumpkin, axis=1)
输出

                      lists condition
0       [5 apples, 2 pears]         B
1  [3 apples, 3 pears, XXX]         A
2           [4 blueberries]         A
3                 [5 kiwis]         C
4                     [YYY]         B

让我们做
分解
然后
np。选择

s = df.explode('lists')
cond = s['lists']=='1 pumpkin'
c1 = cond&s['condition'].eq('A')
c2 = cond&s['condition'].eq('B')
s['lists'] = np.select([c1,c2],['XXX','YYY'],default = s.lists.values )
df['lists'] = s.groupby(level=0)['lists'].agg(list)

让我们做
分解
然后
np。选择

s = df.explode('lists')
cond = s['lists']=='1 pumpkin'
c1 = cond&s['condition'].eq('A')
c2 = cond&s['condition'].eq('B')
s['lists'] = np.select([c1,c2],['XXX','YYY'],default = s.lists.values )
df['lists'] = s.groupby(level=0)['lists'].agg(list)