如何使用带条件的 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]
我的 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]