Xóa phần tử khỏi danh sách trong khung dữ liệu gấu trúc dựa trên giá trị trong cột


8

Giả sử tôi có khung dữ liệu sau:

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'])

Và mục tiêu của tôi là loại bỏ các yếu tố trong danh sách trong loạt A nằm trong loạt B. Nỗ lực của tôi trong việc này là dưới đây:

df['a'] = [i.remove(j) for i,j in zip(df.a, df.b)]

Logic có vẻ như đối với tôi tuy nhiên tôi kết thúc với df ['a'] là một chuỗi null. Chuyện gì đang xảy ra ở đây?

Câu trả lời:


3

list.remove (x) xóa giá trị tại chỗ và trả về Không có. Đó là lý do tại sao các mã trên là thất bại cho bạn. Bạn cũng có thể làm một cái gì đó như sau.

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

Đây là một cách khác để làm điều đó:

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

Giả sử hàng bchỉ chứa một giá trị, sau đó bạn có thể thử với các giá trị sau bằng cách hiểu danh sách trong một hàm, và sau đó chỉ cần áp dụng nó:

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)

Đầu ra:

                           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

Tôi sẽ làm gì

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

Còn cái này thì sao:

b = [[1],[1]] 

df['a'] = df.apply(lambda row: list(set(row['a']).difference(set(row['b']))), axis=1)

b phải theo cách này, nhưng bạn có thể nhận được sự khác biệt ngay cả khi bạn muốn loại bỏ nhiều hơn một yếu tố.

Thí dụ:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.