Saya memiliki kerangka data dan dua kolom memiliki elemen daftar yang memiliki hubungan satu ke satu. PhoneNumber dan PhonePrimary?.

PhoneNumber    PhonePrimary    City       Zip
__________________________________________________
[2107788451,   [True,
2107788451,     True,         San Antonio      71541
2107788451]     False]
-----------------------------------------------------
[5126508976,   [True,           
5124430261]     False]        Austin           78750

Kolom lainnya hanyalah elemen nilai tunggal dan tidak bergantung pada kolom ini. Saya ingin memfilter elemen seri ini ke tempat elemen daftar di PhoneNumber hanya yang cocok dengan nilai sebenarnya dari PhonePrimary. Pesanan cocok. Apakah ada cara untuk melakukan ini tanpa membuat kolom baru untuk hasil, seperti dengan filter?

Hasil terlihat seperti:

PhoneNumber    PhonePrimary     City         Zip
__________________________________________________
[2107788451,    [True,
2107788451]     True]          San Antonio    71541
----------------------------------------------------
[5126508976]    [True]         Austin         78750
1
Ben Smith 21 Januari 2020, 18:44

2 jawaban

Jawaban Terbaik

Idenya adalah untuk mengulangi daftar menggunakan zip dan mempertahankan nilai True. Berikut cara yang bisa Anda lakukan:

def func(f):
    r = [ [x, y] for x,y in zip(f['PhoneNumber'] ,f['PhonePrimary']) if y]

    # separate the values (PhoneNumber & PhonePrimary values)
    col1, fl = [x[0] for x in r], [x[1] for x in r] 

    return pd.Series([col1, fl], index=['PhoneNumber','PhonePrimary'])

df1 = df.apply(func, 1)
print(df1)

                      col1          flag 
0  [2107788451, 2107788452]  [True, True]

# Finally replace the columns from existing df
df[['PhoneNumber', 'PhonePrimary']] = df1[['PhoneNumber', 'PhonePrimary']]

Contoh Data

df = pd.DataFrame({'PhoneNumber': [[2107788451, 2107788452, 2107788453]], 
                   'PhonePrimary': [[True, True, False]],
                    'adr': ['San Antonio'],
                    'zip': 12345})
1
YOLO 21 Januari 2020, 17:06

Saya tidak yakin apakah Anda masih menginginkan daftar setelah operasi.

df = pd.DataFrame({'pn': [[2107788451,2107788451,2107788451], [5126508976,5124430261]], 'pp': [[True,True,False], [True,False]], 'city': ['sa', 'a'], 'zip': [71, 78]})

df = pd.concat([df['pn'].explode(), df['pp'].explode()], axis=1).query('pp == True').merge(df[['city', 'zip']], left_index=True, right_index=True)

Jika $ memberi Anda kesalahan, lakukan dalam 2 baris

ndf = pd.concat([df['pn'].explode(), df['pp'].explode()], axis=1)
df = ndf[ndf['pp'].eq(True)].merge(df[['city', 'zip']], left_index=True, right_index=True)`
           pn    pp city  zip
0  2107788451  True   sa   71
0  2107788451  True   sa   71
1  5126508976  True    a   78
df = df.drop_duplicates(['pn'])

           pn    pp city  zip
0  2107788451  True   sa   71
1  5126508976  True    a   78
1
Kenan 21 Januari 2020, 20:05