繁体   English   中英

1 列的 Pandas 子字符串作为新列的值

[英]Pandas Sub-String of 1 Column as Value of a New Column

我有一个 Pandas 数据框。 在描述列中,我有一个固定的文本。 我想在文本中搜索位置的开始和长度。 我没问题

             Des          pos  end  
Call Number             
CALL2208409  <large text> 722  972

然后我试图添加第 4 列的起始位置和结束位置。 我试过这个以及切片版本。

df['col4']=df.col3.str[df['pos1']:df['end1']]

但是我让 NaN 和 col4 自动获得浮点类型。 设置 .astype 也没有帮助。

如果所有行的开始/停止都相同,我很确定熊猫只支持字符串切片。 您可以像这样使用迭代或apply函数:

数据创建

large_text = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis tincidunt augue. Pellentesque volutpat iaculis massa. Fusce mattis placerat malesuada. Nulla sed quam tincidunt, rhoncus risus eget, eleifend ex. Nullam interdum nulla in mattis luctus. In ac imperdiet lectus, vel rutrum mauris. Mauris pellentesque nulla ut imperdiet posuere. Vivamus porttitor placerat ante non fermentum. Vestibulum pulvinar suscipit feugiat.
""".strip()

df = pd.DataFrame({"large_text": [large_text] * 2, "start": [5, 10], "end": [20, 20]})

print(df)
                                          large_text  start  end
0  Lorem ipsum dolor sit amet, consectetur adipis...      5   20
1  Lorem ipsum dolor sit amet, consectetur adipis...     10   20

使用apply提取子串(注意这和迭代本质上是一样的)

df["extracted"] = df.apply(lambda s: s["large_text"][s["start"]: s["end"]], axis=1)

print(df)
                                          large_text  start  end        extracted
0  Lorem ipsum dolor sit amet, consectetur adipis...      5   20   ipsum dolor si
1  Lorem ipsum dolor sit amet, consectetur adipis...     10   20       m dolor si

另一种方法是使用正则表达式和str.extract方法来提取所需的块,而不是获取开始/结束位置。 但是,由于我不知道您的数据是什么样的,因此我不确定这是否适用于您的用例。

尝试使用 lambda 函数迭代所有行:

df = pd.DataFrame(
    data=[['hello world', 1, 5]],
    index=[0],
    columns=['description', 'start', 'end'])
df.apply(lambda x: x['description'][x['start']:x['end']], axis=1)

结果如您所愿:

0    ello

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM