Python 将1列的子字符串用作新列的值

Python 将1列的子字符串用作新列的值,python,pandas,Python,Pandas,我有一个熊猫数据框。在“说明”列中,我有一个固定的文本。 我想在文本中搜索位置的起点和长度。我明白了 Des pos end Call Number CALL2208409 <large text> 722 972 但是我让NaN和col4自动获取浮点类型。设置.astype也没有帮助。我很确定pandas只支持字符串切片,前提是所有行的开始/停止都相同。您可以像这样使用迭代或应用函数: 数据创建 la

我有一个熊猫数据框。在“说明”列中,我有一个固定的文本。 我想在文本中搜索位置的起点和长度。我明白了

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

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

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

数据创建

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
提取子字符串(注意,这与迭代基本相同)


另一种方法是使用正则表达式和
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
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