Saya memiliki df dengan satu kolom yang berisi daftar string seperti:

    'Name'     'Method'
1   foo        ['car', 'truck', 'transportation::plane']
2   bar        ['car', 'transportation::helicopter', 'boat']
3   baz        ['transportation::car', 'helicopter', 'boat']

Saya hanya ingin menyimpan item dalam daftar di bawah metode yang mengandung "::" sehingga saya mendapatkan sesuatu seperti ini:

    'Name'     'Method'
1   foo        ['transportation::plane']
2   bar        ['transportation::helicopter']
3   baz        ['transportation::car']

Saya tahu saya bisa membuat perulangan for untuk mengulangi setiap daftar dan kemudian menggunakan pemahaman daftar, tetapi saya merasa pasti ada metode yang tidak melibatkan penggunaan perulangan for. Saya mencoba yang berikut ini

for j in range(len(df['Method'])):
    df['Method'].iloc[j] = [x for x in df['Method'].iloc[j] if "::" in x]

Dan butuh waktu lebih lama untuk berjalan daripada yang saya inginkan.

1
jk3 16 Agustus 2017, 16:02

2 jawaban

Jawaban Terbaik

Gunakan apply

In [220]: df.Method.apply(lambda x: [v for v in x if '::' in v])
Out[220]:
1         [transportation::plane]
2    [transportation::helicopter]
3           [transportation::car]

Rincian

In [222]: df['NMethod'] = df.Method.apply(lambda x: [v for v in x if '::' in v])

In [223]: df
Out[223]:
  Name                                   Method                       NMethod
1  foo      [car, truck, transportation::plane]       [transportation::plane]
2  bar  [car, transportation::helicopter, boat]  [transportation::helicopter]
3  baz  [transportation::car, helicopter, boat]         [transportation::car]

Atau, gunakan filter

In [225]: df.Method.apply(lambda x: filter(lambda v: '::' in v, x))
Out[225]:
1         [transportation::plane]
2    [transportation::helicopter]
3           [transportation::car]
Name: Method, dtype: object
2
Zero 16 Agustus 2017, 13:06

Atau Anda dapat menggunakan str.contains

 from itertools import compress
 import pandas as pd 

 df['Method'].apply(lambda x :list(compress(x,pd.Series(x).str.contains('::').tolist())))
0
BENY 16 Agustus 2017, 14:35