Python pandas, вложенные циклы, создание разных списков из строк в соответствии со значениями в другой строке - PullRequest
0 голосов
/ 19 января 2020

У меня есть файл Excel с 3 строками. Первая строка - это оригинальный текст, во второй - исправленная версия текста, а третья содержит начальную точку каждого предложения.

Это выглядит примерно так (извините, я не знал как еще сделать это):

    A        B         C 
1  She                 x 
2  is
3  the 
4  besst     best
5  i         I         x
6  like
7  here      her

Некоторые ячейки в столбце B объединены, но я позаботился об этом и разогнал их. И только если что-то нужно было исправить, в столбце есть значение, иначе оно пустое. Конечный результат, который мне нужен, - это файл, в котором неправильное и правильное предложение завершено и расположены рядом друг с другом, например:

She is the besst.    She is the best.
i like here.         I like her.

Я попытался вложить два цикла внутри друг друга, поэтому, если ячейка в Столбец не пустой, он будет собирать все значения до следующей ячейки в столбце c со значением (предложения, так сказать). И он отлично работает с неправильными предложениями (значения из столбца A), но я не могу заставить его работать со столбцом B.

for i in range(len(df)):
  print(df.loc[i, "A"], df.loc[i, "B"])
  if i in value_in_columnB:
    print(df.loc[i, "B"])
    o = df.loc[i, "B"]
    correctsentence.append(o)
  else :
    print(df.loc[i, "A"])
    m = df.loc[i, "A"]
    correctsentence.append(m)

print(correctsentence)

correctsentence = [y for y in correctsentence if str(y) != 'nan']
print(correctsentence)

Этот код выше работает таким образом, что я могу получить все правильные предложения (смесь столбцов A и B) в одном длинном списке, но не разбить на отдельные предложения , То же самое, я могу сделать это правильно, если это только первый столбец, я просто перебираю строки и как только в списке целых чисел совпадает значение, которое показывает, есть ли x в столбце C, это означает, что есть начало нового предложения.

Но почему-то я не могу соединить оба. Мне просто нужно объединить эти два. Что я могу попробовать? Я пробовал циклы «время и время», и ничто не помогло.

1 Ответ

0 голосов
/ 19 января 2020

Итак, когда вы вводите данные, это выглядит так:

a = 'She is the besst i like here'
b = ['', '', '', 'best', 'I', '', 'her']
c = ['x', '', '' , '', 'x', '', '']

df = pd.DataFrame({'A':a.split(), 'B':b, 'C': c})
print(df)

       A     B  C
0    She        x
1     is         
2    the         
3  besst  best   
4      i     I  x
5   like         
6   here   her   

Тогда этот скрипт:

df.loc[df['B'] == '', 'B'] = df[df['B'] == '']['A']
df.loc[df['C'] == 'x', 'C'] = 1
df['C'] = pd.to_numeric(df['C']).cumsum().ffill()

data = df.groupby('C')['A', 'B'].agg(list).to_dict('list')

with open('file.txt', 'w') as f_out:
    for incorrect, correct in zip(*data.values()):
        print('{}. {}.'.format(' '.join(incorrect), ' '.join(correct)), file=f_out)

Создаст file.txt, что содержит:

She is the besst. She is the best.
i like here. I like her.

РЕДАКТИРОВАТЬ: Версия со значениями NaN:

a = 'She is the besst i like here'
b = [np.nan, np.nan, np.nan, 'best', 'I', np.nan, 'her']
c = ['x', np.nan, np.nan , np.nan, 'x', np.nan, np.nan]

df = pd.DataFrame({'A':a.split(), 'B':b, 'C': c})

df.loc[df['B'].isna(), 'B'] = df[df['B'].isna()]['A']
df.loc[df['C'] == 'x', 'C'] = 1
df['C'] = pd.to_numeric(df['C']).cumsum().ffill()

data = df.groupby('C')['A', 'B'].agg(list).to_dict('list')

with open('file.txt', 'w') as f_out:
    for incorrect, correct in zip(*data.values()):
        print('{}. {}.'.format(' '.join(map(str, incorrect)), ' '.join(map(str, correct))), file=f_out)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...