【问题标题】:Concatenate text from multiple rows and columns into a single text string in pandas dataframe?将多行和多列的文本连接成熊猫数据框中的单个文本字符串?
【发布时间】:2019-12-03 07:01:14
【问题描述】:

Picture of raw excel file format

附上我的原始 excel 数据外观的图片参考。加载到熊猫数据框中。每条消息都分布在多列中,每列之间偶尔会有空白单元格。此外,每条消息的分隔符是 2 个连续的空行。为了合并消息,我合并了所有 5 列:

df['New Column'] = df['Column1'].astype(str) + df['Column2'].astype(str) + df['Column3'].astype(str) + df['Column4'].astype(str) + df['Column5'].astype(str)

现在的问题是:-

  1. 我如何将每条消息聚集到单个单元格/pandas 行中,因为现在,一条消息(例如消息 1)可以并且可能分布在几行中

  2. 如何使用 2 个空行作为分隔符来格式化消息?

  3. 将 5 列合并为 1 列后,有许多 NaN 值,我不确定在非常复杂和混乱的数据结构中,最好的处理方法是什么。

本质上,这是所需的输出

希望我已经足够清楚了,提前感谢您的帮助。

【问题讨论】:

标签: python pandas dataframe nlp nltk


【解决方案1】:

也许这会有所帮助:

df = pd.DataFrame({'col1':['Message 1: asd asd','asd','','Message 2:',''],'col2':['not','asd','asd','asd','asd'],'col3':['smoke', 'black','asd','asd','asd']})
df

                 col1 col2   col3
0  Message 1: asd asd  not  smoke
1                 asd  asd  black
2                      asd    asd
3          Message 2:  asd    asd
4                      asd    asd

result = ['Message'+x for x in df.apply(' '.join, axis=1).sum().split('Message')][1:]
df_result = pd.DataFrame(result)
df_result

                                                   0
0  Message 1: asd asd not smokeasd asd black asd asd
1                         Message 2: asd asd asd asd

【讨论】:

    【解决方案2】:

    我的想法是通过:Series.str.partition 将第一列拆分为助手DataFrame,然后通过前向填充仅通过Mesage 值创建组:

    df1 = df['Column1'].str.partition(':')
    m = df1[1].eq(':')
    df1[2] = df1[2].where(m, df1[0])
    df1[0] = np.where(m, df1[0].add(': '), np.nan)
    df1[0] = df1[0].ffill()
    print (df1)
                 0    1           2
    0  Message 1:     :   Please do
    1  Message 1:            nearby
    2  Message 2:     :     Parking
    3  Message 2:   NaN         NaN
    4  Message 3:     :     
    

    然后将Messages 的值分配给原始索引和第一列:

    df['Column1'] = df1[2]
    df.index = df1[0]
    

    因此可以使用带有 DataFrame.stackjoin 的 lambda 函数按索引聚合(样本数据中的空值是缺失值)

    df2 = df.groupby(level=0).apply(lambda x: ' '.join(x.stack())).reset_index(name='Column1')
    df2['Column1'] = df2.pop(0) + df2['Column1']
    print (df2)
    
                                                 Column1
    0  Message 1:  Please do not smoke 15 mins nearby...
    1  Message 2:  Parking lot on level is only for s...
    2                                  Message 3:  /////
    

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 2021-08-26
      • 2010-09-16
      • 2018-12-21
      • 1970-01-01
      • 2022-07-27
      • 2019-03-14
      相关资源
      最近更新 更多