gpt4 book ai didi

python - 提取括号之间的文本并为每个文本位创建行

转载 作者:行者123 更新时间:2023-12-01 17:52:27 24 4
gpt4 key购买 nike

在 pandas 数据框中,我需要提取方括号之间的文本并将该文本输出为新列。我需要在“StudyID”级别执行此操作,并为提取的每一位文本创建新行。

这是一个简化的示例数据框

data = {
"studyid":['101',
'101',
'102',
'103'],
"Question":["Q1",
"Q2",
"Q1",
"Q3"],
"text":['I love [Bananas] and also [oranges], and [figs]',
'Yesterday I ate [Apples]',
'[Grapes] are my favorite fruit',
'[Mandarins] taste like [oranges] to me'],
}
df2 = pd.DataFrame(data)

我制定了一个解决方案(请参阅下面的代码,如果您运行它,它会显示想要的输出),但是它很长,步骤很多。我想知道是否有更短的方法来做到这一点。

您会看到我使用了 str.findall() 作为正则表达式,但我最初尝试了 str.extractall() 它将提取的文本输出到数据帧,但我不知道如何使用extractall() 生成的数据帧中包含“studyid”和“question”列。所以我求助于使用 str.findall()。

这是我的代码(“我知道它很笨拙”)-如何减少步骤数?预先感谢您的帮助!

 # Step 1: Use Regex to pull out the text between the square brackets
df3 = pd.DataFrame(df2['text'].str.findall(r"(?<=\[)([^]]+)(?=\])").tolist())

# Step 2: Merge the extracted text back with the original data
df3 = df2.merge(df3, left_index=True, right_index=True)

# Step 3: Transpose the wide file to a long file (e.g. panel)
df4 = pd.melt(df3, id_vars=['studyid', 'Question'], value_vars=[0, 1, 2])

# Step 4: Delete rows with None in the value column
indexNames = df4[df4['value'].isnull()].index
df4.drop(indexNames , inplace=True)

# Step 5: Sort the data by the StudyID and Question
df4.sort_values(by=['studyid', 'Question'], inplace=True)

# Step 6: Drop unwanted columns
df4.drop(['variable'], axis=1, inplace=True)

# Step 7: Reset the index and drop the old index
df4.reset_index(drop=True, inplace=True)

df4

最佳答案

如果分配回 Series.str.findall 的输出可以使用 DataFrame.explode 到列,最后使用唯一索引 DataFrame.reset_indexdrop=True:

df2['text'] = df2['text'].str.findall(r"(?<=\[)([^]]+)(?=\])")

df4 = df2.explode('text').reset_index(drop=True)

解决方案 Series.str.extractall ,删除了 MultiIndex 的第二级和上次使用 DataFrame.join用于附加到原始内容:

s = (df2.pop('text').str.extractall(r"(?<=\[)([^]]+)(?=\])")[0]
.reset_index(level=1, drop=True)
.rename('text'))

df4 = df2.join(s).reset_index(drop=True)
<小时/>
print (df4)
studyid Question text
0 101 Q1 Bananas
1 101 Q1 oranges
2 101 Q1 figs
3 101 Q2 Apples
4 102 Q1 Grapes
5 103 Q3 Mandarins
6 103 Q3 oranges

关于python - 提取括号之间的文本并为每个文本位创建行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61025020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com