将 Pandas 数据框中的行分组,应用自定义函数并将结果作为行存储在新数据框中
Group rows in Pandas dataframe, apply custom function and store results in a new dataframe as rows
我有一个 pandas 数据框 df_org,其中包含三列 - 索引(整数)、标题(字符串)和日期(日期)。
我有一个方法 process_title(text),它将一个字符串作为输入并对输入字符串进行分词、删除停用词和词形还原 returns 单词列表。
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
lemmatizer = WordNetLemmatizer()
def process_title(text):
tokens = word_tokenize(text.lower())
try:
tokens.remove("google")
tokens.remove("search")
tokens.remove("-")
except:
pass
lemm_tokens = list(map(lemmatizer.lemmatize,tokens))
without_stop = [word for word in lemm_tokens if word not in stop_words]
return without_stop
我想要一个包含三列的新数据框 - 单词(字符串)、频率(整数)、日期(日期)。 Word 列包含 process_title(text) 返回的列表中的单词(单个单词),Frequency 列包含的频率该词出现在给定日期,日期 列包含日期。
---------------------------------------
| Word | Frequency | Date |
---------------------------------------
| computer | 1 |2021-08-01|
| science | 1 |2021-08-01|
| something| 5 |2021-08-02|
.....
如何根据日期对 df_org 数据框进行分组并创建新的数据框?可以在不影响最终要求的情况下对 process_title(text) 方法进行更改。
您可以使用DataFrame.explode
方法,然后是groupby
和size
:
我将只使用一个简单的 .str.split
而不是您的函数,因为我不知道 word_tokenize
来自哪里。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'title': ['Hello World', 'Foo Bar'], 'date': ['2021-01-12T20:00', '2021-02-10T22:00']})
In [3]: df['words'] = df['title'].apply(lambda s: process_title(str(s)))
In [4]: df
Out[4]:
title date words
0 Hello World 2021-01-12T20:00 [Hello, World]
1 Foo Bar 2021-02-10T22:00 [Foo, Bar]
In [5]: exploded = df.explode('words')
In [6]: exploded
Out[6]:
title date words
0 Hello World 2021-01-12T20:00 Hello
0 Hello World 2021-01-12T20:00 World
1 Foo Bar 2021-02-10T22:00 Foo
1 Foo Bar 2021-02-10T22:00 Bar
In [7]: exploded.groupby(['date', 'words']).size()
Out[7]:
date words
2021-01-12T20:00 Hello 1
World 1
2021-02-10T22:00 Bar 1
Foo 1
dtype: int64
我有一个 pandas 数据框 df_org,其中包含三列 - 索引(整数)、标题(字符串)和日期(日期)。
我有一个方法 process_title(text),它将一个字符串作为输入并对输入字符串进行分词、删除停用词和词形还原 returns 单词列表。
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
lemmatizer = WordNetLemmatizer()
def process_title(text):
tokens = word_tokenize(text.lower())
try:
tokens.remove("google")
tokens.remove("search")
tokens.remove("-")
except:
pass
lemm_tokens = list(map(lemmatizer.lemmatize,tokens))
without_stop = [word for word in lemm_tokens if word not in stop_words]
return without_stop
我想要一个包含三列的新数据框 - 单词(字符串)、频率(整数)、日期(日期)。 Word 列包含 process_title(text) 返回的列表中的单词(单个单词),Frequency 列包含的频率该词出现在给定日期,日期 列包含日期。
---------------------------------------
| Word | Frequency | Date |
---------------------------------------
| computer | 1 |2021-08-01|
| science | 1 |2021-08-01|
| something| 5 |2021-08-02|
.....
如何根据日期对 df_org 数据框进行分组并创建新的数据框?可以在不影响最终要求的情况下对 process_title(text) 方法进行更改。
您可以使用DataFrame.explode
方法,然后是groupby
和size
:
我将只使用一个简单的 .str.split
而不是您的函数,因为我不知道 word_tokenize
来自哪里。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'title': ['Hello World', 'Foo Bar'], 'date': ['2021-01-12T20:00', '2021-02-10T22:00']})
In [3]: df['words'] = df['title'].apply(lambda s: process_title(str(s)))
In [4]: df
Out[4]:
title date words
0 Hello World 2021-01-12T20:00 [Hello, World]
1 Foo Bar 2021-02-10T22:00 [Foo, Bar]
In [5]: exploded = df.explode('words')
In [6]: exploded
Out[6]:
title date words
0 Hello World 2021-01-12T20:00 Hello
0 Hello World 2021-01-12T20:00 World
1 Foo Bar 2021-02-10T22:00 Foo
1 Foo Bar 2021-02-10T22:00 Bar
In [7]: exploded.groupby(['date', 'words']).size()
Out[7]:
date words
2021-01-12T20:00 Hello 1
World 1
2021-02-10T22:00 Bar 1
Foo 1
dtype: int64