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

2024-10-02 08:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试从.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。你知道吗

有人知道怎么做吗?当然不必使用类似于这种方法的方法;我只关心得到结果。你知道吗


Tags: 文件csv方法df列表forreaddata
1条回答
网友
1楼 · 发布于 2024-10-02 08:22:42

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

相关问题 更多 >

    热门问题