假设我有以下数据框:
a = [[1,2,3,4,5,6],[23,23,212,223,1,12]]
b = [1,1]
df = pd.DataFrame(zip(a,b), columns = ['a', 'b'])
我的目标是删除B系列中A系列列表中的元素。我的尝试如下:
df['a'] = [i.remove(j) for i,j in zip(df.a, df.b)]
在我看来,逻辑听起来很合理,但是我最终得到df ['a']为一系列空值。这是怎么回事?
答案 0 :(得分:3)
list.remove(x)删除该值并返回无。这就是上面的代码对您而言失败的原因。您还可以执行以下操作。
a = [[1,2,3,4,5,6],[23,23,212,223,1,12]]
b = [1,1]
df = pd.DataFrame(zip(a,b), columns = ['a', 'b'])
for i, j in zip(df.a, df.b):
i.remove(j)
print df
a b
0 [2, 3, 4, 5, 6] 1
1 [23, 23, 212, 223, 12] 1
答案 1 :(得分:3)
这是另一种方法:
In []:
df2 = df.explode('a')
df['a'] = df2.a[df2.a != df2.b].groupby(level=0).apply(list)
df
Out[]:
a b
0 [2, 3, 4, 5, 6] 1
1 [23, 23, 212, 223, 12] 1
答案 2 :(得分:2)
假设行b
仅包含一个值,那么您可以在函数中使用列表理解来尝试以下操作,然后简单地应用它:
import pandas as pd
a = [[1,2,3,4,5,6],[23,23,212,223,1,12]]
b = [1,1]
df = pd.DataFrame(zip(a,b), columns = ['a', 'b'])
def removing(row):
val = [x for x in row['a'] if x != row['b']]
return val
df['c'] = df.apply(removing,axis=1)
print(df)
输出:
a b c
0 [1, 2, 3, 4, 5, 6] 1 [2, 3, 4, 5, 6]
1 [23, 23, 212, 223, 1, 12] 1 [23, 23, 212, 223, 12]
答案 3 :(得分:2)
我会做什么
s=pd.DataFrame(df.a.tolist(),index=df.index)
df['a']=s.mask(s.eq(df.b,0)).stack().astype(int).groupby(level=0).apply(list)
Out[264]:
0 [2, 3, 4, 5, 6]
1 [23, 23, 212, 223, 12]
dtype: object
答案 4 :(得分:0)
如何?
b = [[1],[1]]
df['a'] = df.apply(lambda row: list(set(row['a']).difference(set(row['b']))), axis=1)
b
必须采用这种方式,但是即使您要删除一个以上的元素,您也可以有所作为。
示例:
import pandas as pd
a = [[1,2,3,4,5,6],[23,23,212,223,1,12]]
b = [[1,5],[1,23]]
df = pd.DataFrame(zip(a,b), columns = ['a', 'b'])
df['a'] = df.apply(lambda row: list(set(row['a']).difference(set(row['b']))), axis=1)