遍历数据框以搜索子字符串并更改大表上的列

时间:2020-09-09 06:04:32

标签: python-3.x pandas

我有两个数据框,我想根据另一个数据框的列更改一个数据框的列。

 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

有帮助吗?

2 个答案:

答案 0 :(得分:3)

pandas.Series.str.extractreplace结合使用的一种方式:

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