如何快速将 pandas 数据框中的某些集合与一组合并
How to unionize certain sets in pandas dataframe with one set quickly
所以,我有以下数据框
A B C
0 a1 {x1, x2, x3} {c1, c3, c5}
1 a2 {y1} {c1, c2, c3}
2 a3 {z1, z2} {c2, c4}
现在,对于 C 列中的集合包含元素 c1 和 c3 的所有行,我想将 B 中的集合与集合 W = {w1, w2} 合并。所以在这种情况下我想要这个结果:
A B C
0 a1 {x1, x2, x3, w1, w2} {c1, c3, c5}
1 a2 {y1, w1, w2} {c1, c2, c3}
2 a3 {z1, z2} {c2, c4}
我现在正在做这个。
uppersets = df.B.apply(lambda s: s.issuperset({c1, c3}))
list_B = df[uppersets].B.to_list()
list_B = [item.union(W) for item in list_B]
df['B'] = pd.Series(list_B)
但是,有没有更有效的方法来做到这一点?我也可以不使用集合,但我不希望 B 列中的集合包含双精度数。
提前干杯!
ps。这是实例化 DF 的代码:
df = pd.DataFrame({'A' : [1, 2, 3],
'B' : [{1, 2, 3}, {1}, {1,2}],
'C' : [{1,3,5}, {1,2,3}, {2,4}] })
ind_s = [j for j in range(3) if df.loc[j,'C'].issuperset({1, 3})]
list_B = df.loc[ind_s].B.to_list()
list_B = [item.union({10,20}) for item in list_B]
df.loc[ind_s,'B'] = pd.Series(data = list_B, index=bool_s)
IIUC,你可以这样做:
m = df['C']>{'c1', 'c3'}
df.loc[m, 'B'] = [e|W for e in df.loc[m, 'B']]
或者,apply
:
m = df['C']>{'c1', 'c3'}
df.loc[m, 'B'] = df.loc[m, 'B'].apply(W.union)
输出:
A B C
0 a1 {x2, w2, w1, x3, x1} {c5, c3, c1}
1 a2 {w2, y1, w1} {c2, c3, c1}
2 a3 {z1, z2} {c2, c4}
可重现的输入:
df = pd.DataFrame({'A': ['a1', 'a2', 'a3'],
'B': [{'x1', 'x2', 'x3'}, {'y1'}, {'z1', 'z2'}],
'C': [{'c1', 'c3', 'c5'}, {'c1', 'c2', 'c3'}, {'c2', 'c4'}]}
)
所以,我有以下数据框
A B C
0 a1 {x1, x2, x3} {c1, c3, c5}
1 a2 {y1} {c1, c2, c3}
2 a3 {z1, z2} {c2, c4}
现在,对于 C 列中的集合包含元素 c1 和 c3 的所有行,我想将 B 中的集合与集合 W = {w1, w2} 合并。所以在这种情况下我想要这个结果:
A B C
0 a1 {x1, x2, x3, w1, w2} {c1, c3, c5}
1 a2 {y1, w1, w2} {c1, c2, c3}
2 a3 {z1, z2} {c2, c4}
我现在正在做这个。
uppersets = df.B.apply(lambda s: s.issuperset({c1, c3}))
list_B = df[uppersets].B.to_list()
list_B = [item.union(W) for item in list_B]
df['B'] = pd.Series(list_B)
但是,有没有更有效的方法来做到这一点?我也可以不使用集合,但我不希望 B 列中的集合包含双精度数。
提前干杯!
ps。这是实例化 DF 的代码:
df = pd.DataFrame({'A' : [1, 2, 3],
'B' : [{1, 2, 3}, {1}, {1,2}],
'C' : [{1,3,5}, {1,2,3}, {2,4}] })
ind_s = [j for j in range(3) if df.loc[j,'C'].issuperset({1, 3})]
list_B = df.loc[ind_s].B.to_list()
list_B = [item.union({10,20}) for item in list_B]
df.loc[ind_s,'B'] = pd.Series(data = list_B, index=bool_s)
IIUC,你可以这样做:
m = df['C']>{'c1', 'c3'}
df.loc[m, 'B'] = [e|W for e in df.loc[m, 'B']]
或者,apply
:
m = df['C']>{'c1', 'c3'}
df.loc[m, 'B'] = df.loc[m, 'B'].apply(W.union)
输出:
A B C
0 a1 {x2, w2, w1, x3, x1} {c5, c3, c1}
1 a2 {w2, y1, w1} {c2, c3, c1}
2 a3 {z1, z2} {c2, c4}
可重现的输入:
df = pd.DataFrame({'A': ['a1', 'a2', 'a3'],
'B': [{'x1', 'x2', 'x3'}, {'y1'}, {'z1', 'z2'}],
'C': [{'c1', 'c3', 'c5'}, {'c1', 'c2', 'c3'}, {'c2', 'c4'}]}
)