pandas для дублирования строк в цикле

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь запустить цикл for для длинного фрейма данных и подсчитать количество английских и неанглийских слов в заданном тексте (каждый текст представляет собой новую строку).

  ------- -------- ---- 
| Index |  Text  | ID |
 ------- -------- ---- 
|     1 | Text 1 |  1 |
|     2 | Text 2 |  2 |
|     3 | Text 3 |  3 |
 ------- -------- ---- 
     
  

Это мой код

 c = 0
for text in df_letters['Text_clean']:
    # Counters
    CTEXT= text
    c  =1
    eng_words = 0
    non_eng_words = 0
    text = " ".join(text.split())
    # For every word in text
    for word in text.split(' '):
      # Check if it is english
      if english_dict.check(word) == True:
        eng_words  = 1
      else:
        non_eng_words  = 1
    # Print the result
    # NOTE that these results are discarded each new text
    df_letters.at[text, 'eng_words'] = eng_words
    df_letters.at[text, 'non_eng_words'] = non_eng_words
    df_letters.at[text, 'Input'] = CTEXT
    #print('Index: {}; EN: {}; NON-EN: {}'.format(c, eng_words, non_eng_words))
  

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

  ------- -------- ---- --------- ------------- --------- 
| Index |  Text  | ID | English | Non-English |  Input  |
 ------- -------- ---- --------- ------------- --------- 
|     1 | Text 1 |  1 |       1 |           0 | Text 1  |
|     2 | Text 2 |  2 |       1 |           0 | Text 2  |
|     3 | Text 3 |  3 |       0 |           1 | Text 3  |
 ------- -------- ---- --------- ------------- --------- 
  

фрейм данных дублируется по длине, добавляя новые строки для каждого нового текста. вот так

  -------- -------- ----- --------- ------------- -------- 
| Index  |  Text  | ID  | English | Non-English | Input  |
 -------- -------- ----- --------- ------------- -------- 
| 1      | Text 1 | 1   | nan     | nan         | nan    |
| 2      | Text 2 | 2   | nan     | nan         | nan    |
| 3      | Text 3 | 3   | nan     | nan         | nan    |
| Text 1 | nan    | nan | 1       | 0           | Text 1 |
| text 2 | nan    | nan | 1       | 0           | Text 2 |
| Text 3 | nan    | nan | 0       | 1           | Text 3 |
 -------- -------- ----- --------- ------------- -------- 
  

Что я здесь делаю не так?

Ответ №1:

Доступ к фрейму данных по значению индекса. Series.at Индекс вашего фрейма данных [1,2,3] есть и нет [Text 1, Text 2, Text 3] . Я думаю, что лучшее решение для вас — заменить ваш цикл на такой:

 for index, text in df_letters['Text_clean'].iteritems():
  

где будет индекс, тогда вы можете сделать:

 df_letters.at[index, 'eng_words'] = eng_words