簡體   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