Как сравнить строки в информационном фрейме с 2D списком массивов - Python - PullRequest
1 голос
/ 04 июня 2019

Моя цель - сравнить строку DataFrame с каждым элементом в списке 2D-массивов.

Вот мой список = мой список

1       2000
2       2000a
3       2000b

Вот мой Dataframe = df

RPN      Source       city  
1       netflix       baltimore
1       netflix       baltimore
2       hulu          orlando
4       hulu          houston

Как объяснено выше, я хотел бы создать новый столбец из списка, который сравнивает каждый RPN в моем DataFrame с первой позицией mylist. Если RPN находится в mylist, возьмите вторую позицию связанного с ним массива и добавьте его в список, который нужно присоединить к фрейму данных. Если не найдено, просто используйте RPN.

ЖЕЛАЕМЫЙ ВЫХОД

RPN      Source          city           npi
1       netflix       baltimore        2000
1       netflix       baltimore        2000
2       hulu          orlando          2000a
4       hulu          houston            4

Здесь мой код ниже, он работает, однако я получаю только RPN для каждой записи, а не NPI, связанный с этим RPN в mylist

#Seperates Portico from Facets, FEP, Nasco, ETC
portico = df[df['SOURCE'] == 'PORTICO']
comparelist = []

#creates a list of RPN and NPI
mylist = portico[['RPN','NPI']].values.tolist()       
for index,x in df.iterrows():
        RPN = x['RPN']
        for a in mylist:
            if RPN in a:
                comparelist.append(a)
            else:
                comparelist.append(RPN)
            break
    df = df.drop(columns = ['NPI'])
    df['NPI'] = comparelist

ТЕКУЩИЙ ВЫХОД

RPN      Source          city           npi
1       netflix       baltimore        1
1       netflix       baltimore        1
2       hulu          orlando          2
4       hulu          houston          4

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Если вы не возражаете против создания еще одного кадра данных для mylist, одним из способов может быть использование merge:

mylist_df = pd.DataFrame(mylist, columns=['RPN', 'npi']) # creating other df 
df = df.merge(mylist_df, how='left', on='RPN')
df['npi'].fillna(df['RPN'], inplace=True) # fill na values with RPN of same dataframe
0 голосов
/ 04 июня 2019

Это можно рассматривать как левое соединение с последующей операцией fillna.

my_series = pd.series(index=[1, 2, 3], data=['2000', '2000a', '2000b'], name='RPN')

df = pd.DataFrame({"RPN": [1, 1, 2, 4], "Source": ['netflix', 'netflix', 'hulu', 'hulu']}).set_index("RPN")

result = df.join(my_series, how="left").reset_index()

result = result.fillna(result.RPN, axis=0)
0 голосов
/ 04 июня 2019

map с диктом + fillna для замены несопоставленных значений. В зависимости от формы mylist выберите правильный словарь:

d = dict(zip(*mylist)) # if [[1, 2, 3], ['2000', '2000a', '2000b']]
d = dict(mylist)       # if [[1, '2000'], [2, '2000a'], [3,'2000b']]

df['npi'] = df.RPN.map(d).fillna(df.RPN)

#   RPN   Source       city    npi
#0    1  netflix  baltimore   2000
#1    1  netflix  baltimore   2000
#2    2     hulu    orlando  2000a
#3    4     hulu    houston      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...