使用for循环遍历列表时从csv文件中提取值

菲拉斯克

尝试从.csv文件中提取值(以便对它们进行计数),同时使用for循环遍历列表尝试查找正确的值时,我遇到了一个问题。

.csv文件的结构如下:

word,pleasantness,activation,imagery
a,2.0000,1.3846,1.0
abandon,1.0000,2.3750,2.4
abandoned,1.1429,2.1000,3.0
abandonment,1.0000,2.0000,1.4
etc...

第一列包含约9000个单词的列表,其他三列包含与该特定单词在语言上相关的值。

我用熊猫创建了一个数据框:

df = pd.read_csv("dictionary.csv", sep=',')

我也有一个文本文件,已将其变成一个列表:

read_file = open(textfile)
data = read_file.read().split()

现在,我的目标是让程序遍历列表中的每个单词,并且每次在.csv文件的第一列中遇到这些单词中的一个时,它将其值添加到现有变量中。依此类推,直到到达列表末尾。

count = 0
pleasantness = 0
activation = 0
imagery = 0

for w in data:
    count = count + 1
    if w in df.word:
        pleasantness = pleasantness + df.pleasantness
        activation = activation + df.activation
        imagery = imagery + df.imagery

print(count, pleasantness, activation, imagery)

这是我能想到的最好的方法,但显然不起作用。到最后,变量仍为0。

有人知道如何执行此操作吗?自然不必使用与此方法类似的方法来完成它。我只关心获得结果。

拉斐尔克

IIUC,如果您有.csv这样的话:

z = StringIO("""word,pleasantness,activation,imagery
a,2.0000,1.3846,1.0
abandon,1.0000,2.3750,2.4
abandoned,1.1429,2.1000,3.0
abandonment,1.0000,2.0000,1.4""")

df = pd.read_csv(z)

产生

>>> df
    word        pleasantness    activation  imagery
0   a           2.0000          1.3846      1.0
1   abandon     1.0000          2.3750      2.4
2   abandoned   1.1429          2.1000      3.0
3   abandonment 1.0000          2.0000      1.4

和诸如

text = ("Lorem abandon ipsum dolor sit amet abandonment , consectetur adipiscing elit. abandon Maecenas consequat accumsan lacus. Duis justo nunc, mattis non ante a, convallis luctus eros. Sed sed urna sed magna auctor sagittis eu id magna. Maecenas leo nunc, tincidunt ut sagittis quis, porttitor sit amet ligula. Nunc faucibus ante ac blandit porta")

data = np.array(text.split())

产生

>>> data

['Lorem' 'abandon' 'ipsum' 'dolor' 'sit' 'amet' 'abandonment' ','
 'consectetur' 'adipiscing' 'elit.' 'abandon' 'Maecenas' 'consequat'
 'accumsan' 'lacus.' 'Duis' 'justo' 'nunc,' 'mattis' 'non' 'ante' 'a,'
 'convallis' 'luctus' 'eros.' 'Sed' 'sed' 'urna' 'sed' 'magna' 'auctor'
 'sagittis' 'eu' 'id' 'magna.' 'Maecenas' 'leo' 'nunc,' 'tincidunt'.  'ut'
 'sagittis' 'quis,' 'porttitor' 'sit' 'amet' 'ligula.' 'Nunc' 'faucibus'
 'ante' 'ac' 'blandit' 'porta']

您可以在加工中使用numpy.isincollections.Counter作为辅助剂:

>>> d = Counter(data[np.isin(data, df.word)])
>>> d
Counter({'abandon': 2, 'abandonment': 1})

并通过计数值

pleasantness, activation, imagery = (0,0,0)
for k,v in d.items():
    values = df.loc[df.word == k]
    pleasantness += values["pleasantness"].item()*v
    activation   += values["activation"].item()*v
    imagery      += values["imagery"].item()*v

在本文中,这将产生

print(pleasantness, activation, imagery)
3.0   6.75   6.2

您的总数就是

print(sum(d.values()))
3

如果要避免通过循环Counter,可以构建一个新的数据框,例如

ndf = pd.merge(pd.DataFrame(dict(d), index=[0]).T, 
               df.set_index("word"), left_index=True, right_index=True)

这是

>>> ndf   
            count   pleasantness    activation  imagery
abandon     2       1.0             2.375       2.4
abandonment 1       1.0             2.000       1.4

并乘以count其余的行

ndf.apply(lambda k: k[0]*k[1:], 1)

要得到

                pleasantness    activation  imagery
abandon         2.0             4.75        4.8
abandonment     1.0             2.00        1.4

现在,您可以玩熊猫内置功能,例如 .sum()

pleasantness    3.00
activation      6.75
imagery         6.20
dtype: float64

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章