从存储在 DataFrame 中的列表中删除项目
Remove items from list stored in DataFrame
我有一个 DataFrame,其中一列包含一些(文本)清理广告,另一列包含对相同广告的一些非常基本的描述。我还将词频以 'keyword':frequency 格式存储在字典中。
任务是从 df
中的列表中清除低于某个频率切点水平的所有术语。
import pandas as pd
adset = {"ID": ["(1483785165, 2009)", "(1538280431, 2010)", "(1795044103, 2010)"],
"Body":[['price', '#', 'bedrooms', '#', 'bathrooms', '#', 'garage'],['cindy', 'lavender', 'mid', 'state', 'realty'],['upgrades', 'galore', 'perfectly', 'maintained', 'home', 'formals']]}
df = pd.DataFrame(adset)
keyword_dict={}
for row in data['Body']:
for word in row:
if word in keyword_dict:
keyword_dict[word]+=1
else:
keyword_dict[word]=1
这就是我卡住的地方:
def remove_sparse_words_from_df(df, term_freq, cutoff=1):
for row in df['Body']:
for word in row:
if term_freq[word]<=cutoff:
return df
我的整个方法可能不对 - 性能是一个大问题,df
有大约 350k 行,“正文”列中的列表可能包含的单词数量从几百到几千不等.将所有数据存储在 pandas df
而不是列表中的原因是我想保留 ID 列,这样我以后可以将我的数据连接到我已经在广告。
IIUC,试试:
- 使用
explode
将列表拆分为单独的行
groupby
和 transform
获取数据框中关键字的计数并仅保留“计数”大于截止值的行
groupby
和agg
得到原始的DataFrame结构。
cutoff = 1
df = df.explode("Body")
output = df.loc[df.groupby("Body")["ID"].transform("size").gt(1)].groupby("ID").agg(list)
>>> output
Body
ID
(1483785165, 2009) [#, #, #]
注意:在您的示例中,“#”是唯一出现多次的“单词”。
我有一个 DataFrame,其中一列包含一些(文本)清理广告,另一列包含对相同广告的一些非常基本的描述。我还将词频以 'keyword':frequency 格式存储在字典中。
任务是从 df
中的列表中清除低于某个频率切点水平的所有术语。
import pandas as pd
adset = {"ID": ["(1483785165, 2009)", "(1538280431, 2010)", "(1795044103, 2010)"],
"Body":[['price', '#', 'bedrooms', '#', 'bathrooms', '#', 'garage'],['cindy', 'lavender', 'mid', 'state', 'realty'],['upgrades', 'galore', 'perfectly', 'maintained', 'home', 'formals']]}
df = pd.DataFrame(adset)
keyword_dict={}
for row in data['Body']:
for word in row:
if word in keyword_dict:
keyword_dict[word]+=1
else:
keyword_dict[word]=1
这就是我卡住的地方:
def remove_sparse_words_from_df(df, term_freq, cutoff=1):
for row in df['Body']:
for word in row:
if term_freq[word]<=cutoff:
return df
我的整个方法可能不对 - 性能是一个大问题,df
有大约 350k 行,“正文”列中的列表可能包含的单词数量从几百到几千不等.将所有数据存储在 pandas df
而不是列表中的原因是我想保留 ID 列,这样我以后可以将我的数据连接到我已经在广告。
IIUC,试试:
- 使用
explode
将列表拆分为单独的行 groupby
和transform
获取数据框中关键字的计数并仅保留“计数”大于截止值的行groupby
和agg
得到原始的DataFrame结构。
cutoff = 1
df = df.explode("Body")
output = df.loc[df.groupby("Body")["ID"].transform("size").gt(1)].groupby("ID").agg(list)
>>> output
Body
ID
(1483785165, 2009) [#, #, #]
注意:在您的示例中,“#”是唯一出现多次的“单词”。