我有两个数据框,我想根据另一个数据框的列更改一个数据框的列。
df1
A label
0 2018 43 NFO BID_-324 dfs.DataNode X 0
1 2018 5 NFO dfs.FSNames BID_123 XX 0
2 2019 13 NFO BID_-398 dfs.DataNode X X 0
3 2019 45 NFO dfs.DataNode BID_-324 0
4 2019 14 NFO BID_123 dfs.DataNode X 0
df2
Id Label
0 BID_-324 Y
1 BID_123 Y
2 BID_-398 N
我想做的是,我想根据其中包含的“ BID *”子字符串更改df1数据帧的标签。新标签应基于df2中的“ BID *”标签。
我的代码如下。但是它需要超过12个小时(仍然没有完成)才能运行。我的数据框有超过一百万个条目。
df3 = df2[df2.Label == 'Y']
for ind, row in df3.iterrows():
idx = df1[df1.A.str.contains(row['Id'])].index
df1.loc[idx,'label'] = 1
有帮助吗?
答案 0 :(得分:3)
将pandas.Series.str.extract
与replace
结合使用的一种方式:
s = df2.set_index("Id")["Label"]
df["label"] = df["A"].str.extract("(%s)" % "|".join(s.index)).replace(s)
print(df)
输出:
A label
0 2018 43 NFO BID_-324 dfs.DataNode X Y
1 2018 5 NFO dfs.FSNames BID_123 XX Y
2 2019 13 NFO BID_-398 dfs.DataNode X X N
3 2019 45 NFO dfs.DataNode BID_-324 Y
4 2019 14 NFO BID_123 dfs.DataNode X Y
答案 1 :(得分:1)
一个想法是将所有值通过|
连接起来并传递给str.contains
:
s = df2.loc[df2.Label == 'Y', 'Id']
df1.loc[df1.A.str.contains('|'.join(s)), 'label'] = 1