将列表添加到现有csv



感谢您对此进行调查:

我正在尝试将计算值(平均值(列表作为新列添加到现有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]

相关内容

  • 没有找到相关文章

最新更新