我对以下问题中一个非常类似于“熊猫”的解决方案感兴趣。我有一个简单的实现,可以遍历行并检查两列中的条件。我正在处理NLP问题,需要在句子中找到标记。我有两个数据框,一个是标记(药品)在start_0
和end_0
位置的,第二个数据框包含句子的start_1
和end_1
。例如:
令牌位置:
df_0 =
start_0 end_0 token
0 20 27 aspirin
1 50 59 trazodone
2 81 88 placebo
3 121 127 haldol
句子的位置:
df_1=
start_1 end_1
0 0 17
1 17 29
2 29 46
3 46 64
4 64 76
5 76 81
6 81 97
7 97 227
我需要在df_1
中创建一个新列,并将令牌放入相应的行,即:
df_1 =
start_1 end_1 token
0 0 17 NaN
1 17 29 aspirin
2 29 46 NaN
3 46 64 trazodone
4 64 76 NaN
5 76 81 NaN
6 81 97 placebo
7 97 227 haldol
如果标记的位置在句子中,则仅匹配两个数据帧。必须有一个具有Pandas功能的简单解决方案,而不是循环遍历行并检查两个边界。
答案 0 :(得分:1)
您真正想做的是将df_0
中的单词映射到df_1
中定义的句子边界。为此,您可以使用pd.cut
,注意在df_1
中包括所有边界:
boundaries = np.hstack((df_1['start_1'], df_1['end_1'].iloc[-1]))
boundary_labels = df_1.index
df_0['sentence'] = pd.cut(df_0['start_0'], boundaries, labels=boundary_labels, right=False)
print(df_0)
start_0 end_0 token sentence
0 20 27 aspirin 1
1 50 59 trazodone 3
2 81 88 placebo 6
3 121 127 haldol 7
您可以轻松地将df_0['sentence']
系列映射回df_1
,因为这些值与所需输出中的df_1['token']
完全对齐。
答案 1 :(得分:1)
您可以尝试使用for循环来完成此操作。我想不到它的向量化版本。
import pandas as pd
df_0 = pd.DataFrame([[20, 27, "aspirin"], [50, 59, "trazodone"], [81, 88, "placebo"], [121, 127, "haldol"]], columns=["start_0", "end_0", "token"])
df_1 = pd.DataFrame([[0, 17], [17, 29], [29, 46], [46, 64], [64, 76], [76, 81], [81, 97], [97, 227]], columns=["start_1", "end_1"])
for i, row in df_0.iterrows():
df_1.loc[(df_1.start_1 <= row.start_0) & (df_1.end_1 >= row.end_0), 'token'] = row.token
print(df_1)
打印出以下内容:
start_1 end_1 token
0 0 17 NaN
1 17 29 aspirin
2 29 46 NaN
3 46 64 trazodone
4 64 76 NaN
5 76 81 NaN
6 81 97 placebo
7 97 227 haldol