Использовать функцию над несколькими столбцами

#python #pandas #function #loops #text

#python #панды #функция #циклы #текст

Вопрос:

Мне нужно применить функцию wordcounter к нескольким столбцам с текстом. Мне нужно, чтобы это выглядело так:

введите описание изображения здесь

Код, который я написал

 written = data.loc[:, 'text1':'text3']
written = written.fillna('none')

def wordcounter (text):
    count = text.str.split().str.len()
    return count

for col in written.columns:
    written[col   '_ct'] = written.apply(wordcounter, axis=1, args=(col,))
 

Но я получаю ошибку TypeError: wordcounter() принимает 1 позиционный аргумент, но было задано 2

Кто-нибудь знает, что я должен делать? Спасибо!

Ответ №1:

Я думаю, вы можете переработать функцию apply для работы со столбцом не как аргумент, а как фильтр фрейма данных:

 import pandas as pd


def wordcounter(text):
    return len(text.split())


data = pd.DataFrame.from_dict(
    {
        'text1': ['test words', 'more words'],
        'text2': ['words words', 'word'],
        'text3': ['words', 'word word'],
    }
)

written = data.loc[:, 'text1':'text3']
written = written.fillna('none')

for col in written.columns:
    written[col   '_ct'] = written[col].apply(wordcounter)

print(written)
 

Вывод

         text1        text2      text3  text1_ct  text2_ct  text3_ct
0  test words  words words      words         2         2         1        
1  more words         word  word word         2         1         2
 

Ответ №2:

Вы можете apply использовать свою функцию по столбцам, а не по строкам, поскольку .str.split().str.len() это уже «векторизованные» операции.

Затем вы можете объединить фреймы данных (ваш оригинал text , а также counts вместе в конечный фрейм данных со всей информацией.

 def word_counter(series):
    return series.str.split().str.len()

counts_df = (df.apply(word_counter)   # apply our function column-wise 
               .add_suffix("_count")) # add a suffix of "_count" to the column names

final_df = df.join(counts_df)         # combine the original dataframe with the counts

print(final_df)
        text1        text2      text3  text1_count  text2_count  text3_count
0  test words  words words      words            2            2            1
1  more words         word  word word            2            1            2