#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