在没有循环的情况下从数据帧的每一行中提取信息
Extract info from each row of a dataframe without a loop
我有一个大数据框(约 500,000 行)。处理每一行都会给我一个 Counter object(一个有 objects 个计数的字典)。我想要的输出是一个新数据框,其中 headers 列是正在计算的 object(字典中的键)。我正在遍历行,但是需要 long.I 知道应该在 Pandas 中避免循环,有什么建议吗?
out_df = pd.DataFrame()
for row in input_df['text']:
tokens = nltk.word_tokenize(row)
pos = nltk.pos_tag(tokens)
count = Counter(elem[1] for elem in pos)
out_df = out_df.append(count, ignore_index=True)
为了说明,Counter(elem[1] for elem in pos)
看起来像Counter({'NN':8, 'VBZ': 2, 'DT':3, 'IN': 4})
我认为在数据帧上使用附加是非常低效的(每次都必须为整个数据帧重新分配内存)。
DataFrames 用于分析数据和轻松添加列,而不是行。
所以我认为更好的方法是先创建列表(列表是 mutable)并在最后将其转换为数据框。
我不熟悉 nltk,所以我无法实际测试它,但按照以下几行应该可以工作:
out_data = []
for row in input_df['text']:
tokens = nltk.word_tokenize(row)
pos = nltk.pos_tag(tokens)
count = Counter(elem[1] for elem in pos)
out_data.append(count)
out_df = pd.DataFrame(out_data)
您可能想要添加以下内容以删除任何 NaN 并将最终计数转换为整数:
out_df = out_df.fillna(0).astype(int)
并在释放内存后删除列表:
del out_data
我认为可能必须使用矢量化解决方案:“遍历 pandas 对象通常很慢。在许多情况下,不需要手动遍历行并且可以避免(使用) 向量化解决方案:可以使用内置方法或 NumPy 函数、(布尔)索引执行许多操作。" 来自 https://towardsdatascience.com/you-dont-always-have-to-loop-through-rows-in-pandas-22a970b347ac
我有一个大数据框(约 500,000 行)。处理每一行都会给我一个 Counter object(一个有 objects 个计数的字典)。我想要的输出是一个新数据框,其中 headers 列是正在计算的 object(字典中的键)。我正在遍历行,但是需要 long.I 知道应该在 Pandas 中避免循环,有什么建议吗?
out_df = pd.DataFrame()
for row in input_df['text']:
tokens = nltk.word_tokenize(row)
pos = nltk.pos_tag(tokens)
count = Counter(elem[1] for elem in pos)
out_df = out_df.append(count, ignore_index=True)
为了说明,Counter(elem[1] for elem in pos)
看起来像Counter({'NN':8, 'VBZ': 2, 'DT':3, 'IN': 4})
我认为在数据帧上使用附加是非常低效的(每次都必须为整个数据帧重新分配内存)。
DataFrames 用于分析数据和轻松添加列,而不是行。
所以我认为更好的方法是先创建列表(列表是 mutable)并在最后将其转换为数据框。
我不熟悉 nltk,所以我无法实际测试它,但按照以下几行应该可以工作:
out_data = []
for row in input_df['text']:
tokens = nltk.word_tokenize(row)
pos = nltk.pos_tag(tokens)
count = Counter(elem[1] for elem in pos)
out_data.append(count)
out_df = pd.DataFrame(out_data)
您可能想要添加以下内容以删除任何 NaN 并将最终计数转换为整数:
out_df = out_df.fillna(0).astype(int)
并在释放内存后删除列表:
del out_data
我认为可能必须使用矢量化解决方案:“遍历 pandas 对象通常很慢。在许多情况下,不需要手动遍历行并且可以避免(使用) 向量化解决方案:可以使用内置方法或 NumPy 函数、(布尔)索引执行许多操作。" 来自 https://towardsdatascience.com/you-dont-always-have-to-loop-through-rows-in-pandas-22a970b347ac