Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在现有列的基础上添加新列-“;值的长度与索引的长度不匹配;_Python_Pandas - Fatal编程技术网

Python 在现有列的基础上添加新列-“;值的长度与索引的长度不匹配;

Python 在现有列的基础上添加新列-“;值的长度与索引的长度不匹配;,python,pandas,Python,Pandas,我有一个现有的Pandas数据框架,如下所示: 我想在dataframe中创建一个新列,其中包含一个字典,该字典的字数/字数源自包含文本体的现有列 我通过以下转换在数据帧的一行上实现了这一点: from collections import Counter obama['word_count'] = [dict(Counter(" ".join(obama['text']).split(" ")).items())] 创建包含所需字典的新列 虽然这起作用,但它给出了以下警告: C:\Ana

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

我想在dataframe中创建一个新列,其中包含一个字典,该字典的字数/字数源自包含文本体的现有列

我通过以下转换在数据帧的一行上实现了这一点:

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
这似乎是索引不匹配的问题。“文本”值均未丢失,因此不会以这种方式失去同步

我去了熊猫警告中的动物园,无法理解它的意思

我也做过谷歌搜索,但我觉得搜索结果不适用于我的问题

要使此添加列过程正常工作,需要做什么?

至少有两种方法:

  • 将列表理解与以下内容结合使用:

    people['word\u count']=\
    [dict(Counter(i[1]['text'].split(“”).items())for i in people.iterrows()]

  • 使用数据帧的
    apply
    方法,类似于:

    people['word\u count']=people.apply(
    lambda x:dict(计数器(x['test'].split(“”).items()),轴=1)


(第二种方法似乎要快一点,但在OP数据帧上似乎也不起作用;一些细节在评论中)

是的,谢谢你。然而,我试图在不使用apply()的情况下直接执行。显然,在大型数据集上,apply()比直接执行要慢得多。请看另一个实际应用生成的
I也倾向于不使用apply,但它可以很方便(为了可读性或例如在使用某些函数时)。无论如何,在我的测试中(在Python3.4/0.17上),以下语句
df['word count']=df.apply(lambda x:dict(Counter(x['test'].split(“”).items()),axis=1)
使用单词计数创建一个新列(不确定为什么在文本中使用连接和拆分)。您还可以使用列表理解来避免应用,例如
df['word count']=[dict(计数器(i[1]['text'].split(“”).items())for i in df.iterrows()]
您是对的,不需要加入。我现在看到计数器可以很好地处理拆分的单词,而不需要逗号来分隔它们。列表理解非常有效。应用静态输出
你能把这两种方法都添加到原始答案中吗?我会标记为答案。谢谢你的帮助!