Объединяйте строки в последовательных ячейках, отличных от NaN, в столбце панд, но не в столбце целиком. - PullRequest
0 голосов
/ 09 января 2019

Я работаю над проблемой nlp, когда мне нужно проанализировать странно отформатированные файлы Excel.

Существует один столбец с текстом, где каждый документ занимает несколько ячеек. Сами документы разделены пустыми ячейками. Есть другие столбцы с оценками, которые я хочу предсказать из текстовых данных.

Вот как это выглядит

Я импортировал листы в фрейм данных Pandas, и теперь я пытаюсь объединить ячейки, принадлежащие каждому документу, сохраняя результаты.

Это состояние цели

Я начал играть с вложенными циклами, но я чувствую, что это намного сложнее, чем необходимо.

Как бы вы подошли к этому? Каждый документ охватывает разное количество ячеек, а документы разделяются разным количеством пустых ячеек. Чтобы усложнить задачу, оценки в столбцах справа иногда находятся в той же строке, что и первая, а иногда в той же строке, что и последняя ячейка соответствующего документа.

Буду очень признателен за вашу помощь! Там должно быть простое решение.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Использование @Lukas setup:

df = pd.DataFrame({'Document': ['This is ', 'first', None, 'This is ', 'second', None, 'this ', 'is ', 'third'],
                   'Score': [None, 1, None, None, 2, None, None, 3, None]})

df.groupby(df['Document'].isna().cumsum(), as_index=False)
  .apply(lambda x : pd.Series([''.join(x['Document'].dropna()), 
                               x.loc[x['Score'].notna(), 'Score'].values[0]], 
                              index=['Document','Score']))

Выход:

         Document  Score
0   This is first    1.0
1  This is second    2.0
2   this is third    3.0
0 голосов
/ 09 января 2019

Просто простой пример того, как это может работать:

import pandas as pd
# setting up the DataFrame with sample data
df = pd.DataFrame({'Document': ['This is ', 'first', None, 'This is ', 'second', `None, 'this ', 'is ', 'third'],`
                   'Score': [None, 1, None, None, 2, None, None, 3, None]})

result_df = pd.DataFrame({'Document':[], 'Score':[]})
doc = ''
for index, row in df.iterrows():
    if pd.notnull(row['Score']):
        #any not NaN value within processed document is score 
        score = row['Score']
    if row['Document']:
        #build doc string until the line is not NaN
        doc += row['Document']
    else:
        result_df = result_df.append({'Document':doc, 'Score':score}, ignore_index=True)
        doc = ''

if doc:
    #when the last line (Document) is not NaN save/print results also:
    result_df = result_df.append({'Document':doc, 'Score':score}, ignore_index=True)

Вывод (result_df):

Document    Score
0   This is first   1.0
1   This is second  2.0
2   This is third   3.0
...