通过用换行符分隔列将pandas数据框分解为单独的行

时间:2019-09-20 05:52:26

标签: python pandas dataframe

我有pandas数据框,其中一列包含文本段落。我想通过将文本段拆分为换行符来将数据框分解为单独的行。文本的段落可能包含多个新行或载体返回字符,如下所示。为了简化,我创建了以下示例

    A                                             B  index_col
0  A0                                            B0          0
1  A1  split this\n\n into \r\n separate \n rows \n          1
2  A2                                            B2          2
3  A3                                            B3          3

我试图将系列拆分为多个值,然后使用堆栈方法将它们组合为单列。我无法获得所需的输出。任何建议将不胜感激!

b = pd.DataFrame(df['B'].str.split('\n').tolist(), index=df['index_col']).stack()
    b = b.reset_index()[[0, 'index_col']]
    b.columns = ['B', 'index_col']
Current output:
            B  index_col
0          B0          0
1  split this          1
2                      1
3     into \r          1
4   separate           1
5       rows           1
6                      1
7          B2          2
8          B3          3

Desired output:
            B  index_col
0          B0          0
1  split this          1
2     into             1
3   separate           1
4       rows           1
5          B2          2
6          B3          3

1 个答案:

答案 0 :(得分:0)

示例

df = pd.DataFrame({'A':['A0','A1'],
                    'B':['B0', 'split this\n\n into \r\n separate \n rows \n'],
                   'index_col':[0,1]})
print (df)
    A                                             B  index_col
0  A0                                            B0          0
1  A1  split this\n\n into \r\n separate \n rows \n          1

您的解决方案应使用DataFrame.set_index进行更改,Series.str.replaceexpand=True的{​​{1}}添加到Series.str.split中,最后从DataFrame中填充空字符串由DataFrame.query

B

对于熊猫0.25+,可以使用DataFrame.explode

df1 = (df.set_index('index_col')['B']
         .str.replace('\r', ' ')
         .str.split('\n', expand=True)
         .stack()
         .rename('B')
         .reset_index(level=1, drop=True)
         .reset_index()[['B', 'index_col']]
         .query("B != ''"))
print (df1)
            B  index_col
0          B0          0
1  split this          1
3      into            1
4   separate           1
5       rows           1