Python 如何在pandas中拆分str.split()列的输出?

Python 如何在pandas中拆分str.split()列的输出?,python,pandas,string,split,Python,Pandas,String,Split,事情是这样的,我有这样的数据集(我们称之为df): 正如你所看到的,这是一个包含调查的表格,我试图只从列文本中得到答案。我的第一个想法是尝试拆分文本,就像这样: df['text_splitted'] = df.text.str.split('\n') df['final_text'] = df. text_splitted.str.split(':') 然后我会这样做: df['text_splitted'] = df.text.str.split('\n') df['final_tex

事情是这样的,我有这样的数据集(我们称之为df):

正如你所看到的,这是一个包含调查的表格,我试图只从列文本中得到答案。我的第一个想法是尝试拆分文本,就像这样:

df['text_splitted'] = df.text.str.split('\n')
df['final_text'] = df. text_splitted.str.split(':')
然后我会这样做:

df['text_splitted'] = df.text.str.split('\n')
df['final_text'] = df. text_splitted.str.split(':')

但是,最终文本正在返回NaN。刚才发生了什么事?为什么新列返回null?有什么方法可以解决这个问题(或者有更好的方法来完成我在这里尝试的工作)?

您可以使用.apply()和.split()的组合来获得答案

df = pd.DataFrame({'text': ['How was your experience?: Great\nWhat did you buy?: A book\n']})
输入测向

    text
0   How was your experience?: Great\nWhat did you ..
分成问题和答案

df['questions'] = df['text'].apply(lambda x: [y.split(":")[0] for y in x.split("\n")])
df['answers'] = df['text'].apply(lambda x: [y.split(":")[1] for y in x.split("\n") if len(y)>1])
输出测向

    answers              questions
0   [ Great, A book]    [How was your experience?, What did you buy?, ]

在编写时,需要将列
文本
拆分两次。之后,您可以创建包含3列的数据框:

  • id
    来自原始数据帧
  • 问题
    (偶数行)来自上一次拆分
  • 回答上一次拆分中的
    (奇数行)
text=df[“text”].str.strip().str.split(“\n”).explode().str.split(“:”.explode()
out=pd.merge(df[“id”],pd.DataFrame({“问题”:文本[0::2],“答案”:文本[1::2]}),
左索引=真,右索引=真)。重置索引(drop=真)
你觉得这种格式怎么样

>>输出
身份证问题答案
你的经历怎么样?伟大的
你买了什么?书
你的经历怎么样?好
你买了什么?笔
4 C2你的经历如何?可怕的
你买了什么?铅笔
您可以尝试以下方法:

df.set_index('id')['text'].str.replace(r'\\n$', '').str.split(r'\\n').explode().str.split(': ', expand=True)

                           0         1
id                                    
A1  How was your experience?     Great
A1         What did you buy?    A book
B1  How was your experience?      Good
B1         What did you buy?     A pen
C2  How was your experience?     Awful
C2         What did you buy?  A pencil

这是因为
df['text\u splited']
不是字符串,而是一个列表(
split
)@correliane使用
是正确的。列表上的str.split(':')
将导致null/NaN。然而,为了改进这个问题和未来的问题,您的数据应该是一段易于复制的代码,可以用来轻松地构建数据框架。看,还有。如果您包含了预期的输出,那么您不仅可能得到错误的地方,还可能得到一个有效的解决方案。不知道为什么答案返回“IndexError:list index out range”。有什么想法吗?