列の値に基づいてパンダデータフレームのリストから要素を削除します


8

次のデータフレームがあるとしましょう:

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']が一連のヌルになっています。ここで何が起こっているのですか?

回答:


3

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

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

行に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]

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

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.