Как отфильтровать две серии в кадре данных, где значение элемента списка истинно в одной из серий - PullRequest
1 голос
/ 21 января 2020

У меня есть фрейм данных, и в двух столбцах есть элементы списка, которые имеют отношение один к одному. PhoneNumber и PhonePrimary?.

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

Остальные столбцы являются просто элементами с единичным значением и не зависят от этих столбцов. Я хочу отфильтровать эти элементы серии так, чтобы элементы списка в PhoneNumber были только теми, которые соответствуют истинным значениям PhonePrimary. Заказы совпадают. Есть ли способ сделать это без создания новых столбцов для результатов, например, с помощью фильтра?

Результаты выглядят так:

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

Ответы [ 2 ]

1 голос
/ 21 января 2020

Я не уверен, что вам все еще нужны списки после операции.

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)

Если $ выдает ошибку, сделать это в 2 строки

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 голос
/ 21 января 2020

Идея состоит в том, чтобы перебирать списки, используя zip и сохраняя значения True. Вот способ, которым вы можете сделать:

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

Пример данных

df = pd.DataFrame({'PhoneNumber': [[2107788451, 2107788452, 2107788453]], 
                   'PhonePrimary': [[True, True, False]],
                    'adr': ['San Antonio'],
                    'zip': 12345})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...