使用for循环

时间:2018-05-17 19:23:33

标签: python python-3.x pandas

我尝试从.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个单词的列表,另外3个列包含与该特定单词具有语言相关性的值。

我用pandas创建了一个数据帧:

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。

有没有人知道如何做到这一点?使用类似于这种方法的东西自然不必完成;我只关心得到结果。

1 个答案:

答案 0 :(得分:2)

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

现在您可以使用pandas bulit-in函数,例如.sum()

pleasantness    3.00
activation      6.75
imagery         6.20
dtype: float64