在满足条件的列中查找行的有效方法

时间:2018-09-08 23:39:21

标签: python pandas

我对以下问题中一个非常类似于“熊猫”的解决方案感兴趣。我有一个简单的实现,可以遍历行并检查两列中的条件。我正在处理NLP问题,需要在句子中找到标记。我有两个数据框,一个是标记(药品)在start_0end_0位置的,第二个数据框包含句子的start_1end_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功能的简单解决方案,而不是循环遍历行并检查两个边界。

2 个答案:

答案 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