【问题标题】:Python Pandas DataFrame cell changes disappearPython Pandas DataFrame 单元格更改消失
【发布时间】:2014-04-04 14:51:09
【问题描述】:

我是 python 和 pandas 的新手,我正在尝试操作 csv 数据文件。我加载了两个数据框,一个包含带有关键字的列,另一个是带有“id”和“word”列的“bagOfWords”。我要做的是在第一个数据框中添加一列,其中包含“列表字符串”中关键字的 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 中为好吧。

我的猜测是我在某处创建了一个副本,但我不知道在哪里。

任何想法这里有什么问题或如何以不同的方式做同样的事情? 谢谢!

更新:

网站AlchData.cvs 是这样的

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

还有词袋 cvc。

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]

【问题讨论】:

  • 你能提供一个你是两个 csv 文件的小例子吗?你应该从那个小例子中得到输出。这听起来应该可以在 1 或 2 行内完成。
  • 我添加了示例数据,1-2行确实不错。
  • 我只在 python 2.7 中测试过它,但可能会有一些涉及i 的变量阴影/覆盖。您使用 i 作为两个 for 循环的变量。

标签: python loops csv pandas


【解决方案1】:

在两个for 循环中使用i 肯定有问题。改变它,看看是否有帮助。

【讨论】:

  • 没有问题。这类“小”错误有时真的很难发现。
【解决方案2】:

我会尝试这样的事情。您需要在更大的数据集上分析性能。

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 列拆分为单词列表。一般来说,在 DataFrames 中存储列表在性能方面是个坏主意,但这是目前最直接的方法。

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

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

然后将df2 的查找应用到vals 中列表的每个元素:

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]

【讨论】:

  • 所以它最终成为 3 班轮。最慢的部分可能是 vals.apply(lambda x: [df2.loc[y, 'id'] for y in x]) 行,它本质上是一个双重嵌套的 for 循环。但您需要对其进行测量以确定。
  • 感谢这对我有用,但我有一些特殊情况需要处理,所以我会坚持使用我的笨重且可能很慢的代码,因为我使用的数据集不是很大和时间不是问题。
猜你喜欢
  • 1970-01-01
  • 2016-12-26
  • 2017-08-27
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2017-12-28
  • 2022-12-15
相关资源
最近更新 更多