我的目标是将DataFrame行与二维数组列表中的每一项进行比较。
列表如下: my = mylist
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在mylist中,则获取与其关联的数组的第二个位置,并将其附加到要连接到数据帧的列表中。如果找不到,只需使用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
发布于 2019-06-05 03:43:47
如果您不介意为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
发布于 2019-06-05 03:44:01
使用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
发布于 2019-06-05 03:57:08
这可以看作是一个左连接,然后进行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)
https://stackoverflow.com/questions/56450251
复制相似问题