Python Pandas基于现有列添加新列 - "值的长度与索引的长度不匹配"

时间:2015-12-05 11:44:35

标签: python pandas

我有一个现有的Pandas数据框,如下所示:

enter image description here

我想在数据框中创建一个新列,其中包含一个字典,其中包含从包含文本正文的现有列派生的字/字数。

我使用以下转换在数据帧的单行上工作:

from collections import Counter
obama['word_count'] = [dict(Counter(" ".join(obama['text']).split(" ")).items())]

创建包含预期字典的新列。

enter image description here

虽然这有效但它会发出以下警告:

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搜索,但我觉得不会发现结果适用于我的问题。

需要使此添加列过程有效吗?

1 个答案:

答案 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上工作;一些细节在评论中)