如何将数据框的行与2D数组列表进行比较-Python

时间:2019-06-04 19:36:04

标签: python pandas numpy for-loop arraylist

我的目标是将DataFrame行与2D数组列表中的每个项目进行比较。

这是我的列表=我的列表

1       2000
2       2000a
3       2000b

这是我的数据框= df

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

如上所述,我想从一个列表中创建一个新列,将DataFrame中的每个RPN与mylist的第一个位置进行比较。如果RPN在我的列表中,请使用与其关联的数组的第二个位置,并将其附加到要加入数据框的列表中。如果找不到,请使用RPN。

期望的输出

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

下面是我的代码,它可以正常工作,但是我只为每条记录获取RPN,而不是与mylist中与该RPN相关的NPI

#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 个答案:

答案 0 :(得分:1)

如果您不介意为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

答案 1 :(得分:0)

map和dict + fillna替换未映射的值。根据{{​​1}}的形状,选择正确的字典:

mylist

答案 2 :(得分:0)

这可以看成是之后进行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)
相关问题