如何使用带条件的 pandas 函数,这里以 .explode 为例

how to use pandas function with condition, here are using .explode as example

我的 df:

C1     C2       C3
 A   True  [a,b,c]
 A  False  [a,b,c]
 B   True  [a,b,c]
 B  False  [a,b,c]

我想要的是,在 C1 == A and C2 == True 时只在 C3 上应用 .explode。我怎样才能达到预期的结果:

C1     C2       C3
 A   True        a
 A   True        b
 A   True        c
 A  False  [a,b,c]
 B   True  [a,b,c]
 B  False  [a,b,c]

您可以 select 分解行并将其与其他行连接。

m = df['C2'] & df['C1'].eq('A')

out = pd.concat([df[m].explode(['C3']), df[~m]])
print(out)

  C1     C2         C3
0  A   True          a
0  A   True          b
0  A   True          c
1  A  False  [a, b, c]
2  B   True  [a, b, c]
3  B  False  [a, b, c]

由于我们select排在最前面,如果想保持原来的顺序,可以

out = (pd.concat([df[m].explode(['C3']), df[~m]])
       .sort_index()
       .reset_index(drop=True))
print(df)
  C1     C2             C3
0  A   True  ['a','b','c']
1  A  False  ['a','b','c']
2  B   True  ['a','b','c']
3  B  False  ['a','b','c']
4  A   True  ['a','b','c']

print(out)
  C1     C2         C3
0  A   True          a
1  A   True          b
2  A   True          c
3  A  False  [a, b, c]
4  B   True  [a, b, c]
5  B  False  [a, b, c]
6  A   True          a
7  A   True          b
8  A   True          c

如果你不关心顺序

out = pd.concat([df[m].explode(['C3']), df[~m]], ignore_index=True)
print(out)

  C1     C2         C3
0  A   True          a
1  A   True          b
2  A   True          c
3  A   True          a
4  A   True          b
5  A   True          c
6  A  False  [a, b, c]
7  B   True  [a, b, c]
8  B  False  [a, b, c]

另一种方法,您可以屏蔽未找到条件的值(使用 where), explode and combine_first:

m = df['C2'] & df['C1'].eq('A')
out = df.where(m).explode('C3').combine_first(df)

或者,可能更高效但不够简洁:

out = df.assign(C3=df['C3'].where(m)).explode('C3').fillna({'C3': df['C3']})

输出:

  C1     C2         C3
0  A   True          a
0  A   True          b
0  A   True          c
1  A  False  [a, b, c]
2  B   True  [a, b, c]
3  B  False  [a, b, c]