【问题标题】: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)
现在的问题是:-
我如何将每条消息聚集到单个单元格/pandas 行中,因为现在,一条消息(例如消息 1)可以并且可能分布在几行中
如何使用 2 个空行作为分隔符来格式化消息?
将 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.stack 和 join 的 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: /////