Python Pandas DataFrame单元格变化消失

1 投票
2 回答
872 浏览
提问于 2025-04-17 20:37

我刚开始学习Python和Pandas,想要处理一个CSV数据文件。我加载了两个数据框,一个包含关键词的列,另一个是一个“词袋”,里面有“id”和“word”两列。我想做的是在第一个数据框中添加一列,里面是关键词的id,格式像这样“[1,2,8,99 ...]”。

这是我目前想到的代码

websitesAlchData = pd.io.parsers.read_csv('websitesAlchData.csv', sep=';', index_col='referer', encoding="utf-8")

bagOfWords = pd.io.parsers.read_csv('bagOfWords.csv', sep=';', header=0, names=["id","words","count"], encoding="utf-8")
a = set(bagOfWords['words'])
websitesAlchData['keywordIds'] = "[]"
for i in websitesAlchData.index
    keywords = websitesAlchData.loc[i,'keywords']
    try:
        keywordsSet = set([ s.lower() for s in keywords.split(",") ])
    except:
        keywordsSet = set()
    existingWords = a & keywordsSet
    lista = []
    for i in bagOfWords.index:
        if bagOfWords.loc[i,'words'] in existingWords:
            lista.append(bagOfWords.loc[i,'id'])

    websitesAlchData.loc[i,'keywordIds'] = str(lista)
    print(str(lista))
    print(websitesAlchData.loc[i,'keywordIds'])
websitesAlchData.reset_index(inplace=True)
websitesAlchData.to_csv(path_or_buf = 'websitesAlchDataKeywordCode.csv', index=False, sep=";", encoding="utf-8")

在for循环结束时的两个打印结果是我预期的,但是当我尝试打印整个数据框“websitesAlchData”时,"keywordIds"这一列仍然是“[]”,在生成的CSV文件中也是如此。

我猜可能是在某个地方创建了一个副本,但我看不出来在哪里。

有没有人知道这里出了什么问题,或者有什么其他方法可以做到同样的事情?谢谢!

更新:

websitesAlchData.cvs的内容看起来是这样的

referer;category;keywords
url;int;word0,word2,word3
url;int;word1,word3
...

而词袋的CSV文件是这样的。

id;index;count
0;word0;11
1;word1;14
2;word2;14
3;word3;14
...

预期的输出结果

referer;category;keywords;keywordIds
url;int;word0,word2,word3;[0,2,3]
url;int;word1,word3;[1,3]

2 个回答

0

我会尝试这样的做法。你需要在更大的数据集上测试性能。

In [146]: df1
Out[146]: 
  referer category           keywords
0     url      int  word0,word2,word3
1     url      int        word1,word3

[2 rows x 3 columns]

In [147]: df2
Out[147]: 
       id  count
index           
word0   0     11
word1   1     14
word2   2     14
word3   3     14

[4 rows x 2 columns]

keywords 这一列拆分成一个个单词的列表。一般来说,在数据框中存储列表会影响性能,但现在这是最简单的方法。

In [148]: vals = df1.keywords.str.split(',')

In [149]: vals
Out[149]: 
0    [word0, word2, word3]
1           [word1, word3]
Name: keywords, dtype: object

接着,从 df2 中查找每个列表中的元素:

In [151]: ids = vals.apply(lambda x: [df2.loc[y, 'id'] for y in x])

In [152]: ids
Out[152]: 
0    [0, 2, 3]
1       [1, 3]
Name: keywords, dtype: object

最后把它们合并起来:

In [154]: df = pd.concat([df1, ids], axis=1)

In [155]: df
Out[155]: 
  referer category           keywords   keywords
0     url      int  word0,word2,word3  [0, 2, 3]
1     url      int        word1,word3     [1, 3]

[2 rows x 4 columns]
0

在这段代码中,使用了两个 for 循环都用同一个 i 变量,这样肯定有问题。试着把其中一个 i 改成其他名字,看看这样是否能解决问题。

撰写回答