感谢您对此进行调查:
我正在尝试将计算值(平均值(列表作为新列添加到现有csv中。
这是我的MWE:
import csv
import re
import pandas as pd
import oseti
import numpy as np
# handle csv data
df = pd.read_csv('filepath/text.csv')
analyzer = oseti.Analyzer()
dtype_before = type(df["text"])
text_list = df["text"].tolist()
# create df for sentiment analysis
list_sa = (np.mean(list(map(analyzer.analyze,text_list))).tolist())
df_sa = pd.DataFrame (list_sa, columns = ['sa_mean'])
print (df_sa)
这部分工作(尽管我收到警告:
不赞成从粗糙的嵌套序列创建ndarray(这是一个列表或元组,或具有不同长度或形状的元组或ndarray(。如果要执行此操作,则在创建ndarray时必须指定"dtype=object"。
(并正确打印出值(因为我是新手,所以我想确保它看起来像我想要的(。打印的结果看起来有点像这样:
sa_mean
0 0.000000
1 0.000000
2 0.000000
3 -0.018519
4 0.037037
但是,如果我不打印,而是尝试将其作为原始加载的csv的新列("文件路径/text.csv"(,我不确定如何处理它(是否有必要将其作为DataFrame或Series?(
我试过这个(而不是最后一行
df["new_column"] = df_sa
df.to_csv("text.csv", index=False)
然而,我收到了一个错误-csv仍在创建中,但我想了解是否有问题:
不赞成从粗糙的嵌套序列创建ndarray(这是一个列表或元组,或具有不同长度或形状的元组或ndarray(。如果要执行此操作,则在创建ndarray时必须指定"dtype=object"。
我真的不确定为什么会发生这种情况以及如何修复。
提前谢谢!
编辑:
打印(listronga(将如下所示:
[0.0, 0.0, 0.0, -0.018518518518518517, 0.037037037037037035, 0.037037037037037035, 0.0, 0.0, 0.0, 0.0, 0.0, -0.037037037037037035, 0.0, 0.037037037037037035, 0.0, 0.037037037037037035, 0.0, 0.0, 0.0, -0.037037037037037035, -0.012345679012345678, -0.037037037037037035, 0.0, 0.0, -0.037037037037037035, -0.037037037037037035, 0.0, 0.0, 0.0, -0.037037037037037035, -0.037037037037037035, 0.037037037037037035, 0.0, 0.0, 0.0, -0.037037037037037035, 0.0, 0.0, 0.0, -0.037037037037037035, -0.037037037037037035, 0.037037037037037035, 0.0, 0.0, -0.037037037037037035, -0.037037037037037035, 0.0, 0.037037037037037035, -0.037037037037037035, -0.037037037037037035, -0.037037037037037035, 0.037037037037037035, 0.037037037037037035, -0.037037037037037035, 0.037037037037037035, 0.037037037037037035, 0.0, 0.037037037037037035, -0.037037037037037035, 0.037037037037037035, 0.0, 0.0, -0.037037037037037035, 0.037037037037037035, 0.0, 0.037037037037037035, -0.037037037037037035, 0.0, 0.0, -0.037037037037037035, 0.0, 0.037037037037037035, 0.0, 0.0, -0.037037037037037035, -0.024691358024691357]
将列表理解与np.mean
一起使用并分配给新列,此处不需要df_sa
:
df = pd.read_csv('filepath/text.csv')
analyzer = oseti.Analyzer()
df['new_column'] = [np.mean(analyzer.analyze(x)) for x in df['text']]
或者创建lambda函数:
df['new_column'] = df['text'].apply(lambda x: np.mean(analyzer.analyze(x)))
df.to_csv("text.csv", index=False)
是否可以判断哪个语句产生警告?您可能需要一行一行地运行,或者在它们之间打印(如果运行脚本(。
我怀疑是
np.mean(list(map(analyzer.analyze,text_list))
该警告意味着您(或代码调用的东西(正试图从长度不同的列表中生成一个数组。例如:
In [245]: alist = [[1,2,3],[4,5],[6]]
In [246]: alist
Out[246]: [[1, 2, 3], [4, 5], [6]]
In [247]: np.array(alist)
<ipython-input-247-7512d762195a>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
np.array(alist)
Out[247]: array([list([1, 2, 3]), list([4, 5]), list([6])], dtype=object)
结果是一个1d数组,对象为dtype。它无法从这样的列表中生成2d数组。
尝试这样做意味着在该列表上,会产生相同的警告,因为它首先必须生成一个数组:
In [248]: np.mean(alist)
/usr/local/lib/python3.8/dist-packages/numpy/core/_methods.py:163: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
arr = asanyarray(a)
Out[248]:
array([0.33333333, 0.66666667, 1. , 1.33333333, 1.66666667,
2. ])
警告不会像错误那样提供回溯,但它确实显示了引发警告的操作。平均值也偏离了-列表被"压平"了,但除数是3!
正如jezrael所建议的,我们可以通过获得子列表的方法
In [249]: [np.mean(x) for x in alist]
Out[249]: [2.0, 4.5, 6.0]