回答:
list.remove(x)はインプレースの値を削除し、Noneを返します。そのため、上記のコードは失敗します。次のようなこともできます。
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
行にb含まれる値が1つだけであると仮定すると、関数内でリスト内包表記を使用して以下を試して、それを単純に適用できます。
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]
これはどう:
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)