我有一个现有的Pandas数据框,如下所示:
我想在数据框中创建一个新列,其中包含一个字典,其中包含从包含文本正文的现有列派生的字/字数。
我使用以下转换在数据帧的单行上工作:
from collections import Counter
obama['word_count'] = [dict(Counter(" ".join(obama['text']).split(" ")).items())]
创建包含预期字典的新列。
虽然这有效但它会发出以下警告:
C:\Anaconda\lib\site-packages\ipykernel\__main__.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
from ipykernel import kernelapp as app
当我对整个数据帧使用相同的转换时:
people['word_count'] = [dict(Counter(" ".join(people['text']).split(" ")).items())]
失败并显示错误消息:
ValueError: Length of values does not match length of index
这似乎是索引不匹配的问题。没有一个'文本'值丢失了,所以它不会以这种方式失去同步。
我已经在Pandas警告中去了url并且无法掌握它的内容。
我也完成了我的Google搜索,但我觉得不会发现结果适用于我的问题。
需要使此添加列过程有效吗?
答案 0 :(得分:1)
至少有两种方法可以做到这一点:
使用列表理解,例如:
people['word_count'] = \
[dict(Counter(i[1]['text'].split(" ")).items()) for i in people.iterrows()]
使用DataFrame的apply
方法,例如:
people['word_count'] = people.apply(
lambda x: dict(Counter(x['test'].split(" ")).items()), axis=1)
(第二种方法似乎有点快,但似乎并没有在OP DataFrame上工作;一些细节在评论中)