【问题标题】:pandas: 'join' failing to compile熊猫:“加入”未能编译
【发布时间】:2017-01-06 04:15:31
【问题描述】:

我在编译我的代码时遇到了一点问题。看起来main_df = df 的行导致失败,我不太明白为什么。

非常感谢任何帮助。

import quandl
import pandas as pd

# API key was removed
api_key = 'X'
fiddy_states = pd.read_html('https://simple.wikipedia.org/wiki/List_of_U.S._states',flavor='html5lib')

main_df = pd.DataFrame()

for abbv in fiddy_states[0][0][1:]:
    query = "FMAC/HPI_"+str(abbv)
    df = quandl.get(query, authtoken=api_key)

    if main_df.empty:
        main_df = df
    else:
        main_df = main_df.join(df)

print(main_df.head())

我收到此错误:

Traceback(最近一次调用最后一次): 文件“C:/Users/Dave/Documents/Python Files/helloworld.py”,第 17 行,在 main_df = main_df.join(df)

文件“C:\Python35\lib\site-packages\pandas\core\frame.py”,第 4385 行,加入 rsuffix=rsuffix, sort=sort)

文件“C:\Python35\lib\site-packages\pandas\core\frame.py”,第 4399 行,在 _join_compat suffixes=(lsuffix, rsuffix), sort=sort)

文件“C:\Python35\lib\site-packages\pandas\tools\merge.py”,第 39 行,合并中 返回 op.get_result()

文件“C:\Python35\lib\site-packages\pandas\tools\merge.py”,第 223 行,在 get_result rdata.items, rsuf)

文件“C:\Python35\lib\site-packages\pandas\core\internals.py”,第 4445 行,在 items_overlap_with_suffix 中 to_rename) ValueError:列重叠但未指定后缀:Index(['Value'], dtype='object')

【问题讨论】:

  • 你想做什么?在每次迭代中将新数据附加到数据框? pd.join 执行 sql 样式的连接,可能不是您在这里寻找的。试试main_df = main_df.append(df)
  • 在这种情况下,我希望加入而不是追加。附加确实有效,但没有给我我想要的东西。你知道为什么它在这种情况下不起作用吗?
  • 好吧,我不知道你在找什么。你能举一个输入/输出的例子吗?
  • 应该是一个以Date为索引的数据框,然后是50列(每一列应该是一个州的缩写),数据对应一个特定的日期。

标签: python pandas join quandl


【解决方案1】:

您可以将代码列表传递给quandl.get 函数,然后您会返回一个数据框,其中包含一列中每个代码的数据。代码:

import quandl
import pandas as pd

fiddy_states = pd.read_html('https://simple.wikipedia.org/wiki/List_of_U.S._states', flavor='html5lib')
data = quandl.get(["FMAC/HPI_"+s for s in fiddy_states[0][0][1:]])

【讨论】:

  • 嗯,看起来可行 - 非常感谢!我想我仍然对为什么 .join() 在我的代码的原始实例中不起作用感到有点困惑。
  • 这不起作用,因为从 quandl 返回的数据框对于每个 get 查询都有一个名为“Value”的列,因此当您尝试加入时,您需要告诉它如何命名列.如果你还在原来的for循环中设置了列名(比如abbv),我认为它会起作用。
  • @D.Wang 不用担心。我只是在每次迭代中从 quandl 打印响应对象(将 for 循环更改为 fiddy_states[0][0][1:4]] 只进行 3 次调用,否则会很慢)。我可以看到顶部有一个“值”列和一个名为“日期”的索引。请参阅this question 了解如何重命名列。
  • 我说的是你的 for 循环,它每次迭代都会执行一次 get 查询。这里的列名是“值”。我认为您在谈论我的答案中的代码,它在一行中执行所有查询,并给出您描述的描述性列名称。如果您想坚持使用 for 循环(我不建议这样做,执行 50 次连接会很慢),请在每一步将“值”列重命名为 abbv 的值。是的,您必须在加入之前重命名。
  • @D.Wang 是的,您只需要确保列名是唯一的。想想你想要做什么。一旦你知道这一点,Pandas 通常会让它变得非常简单和简洁。
猜你喜欢
  • 2016-11-25
  • 2020-03-12
  • 2014-09-21
  • 2020-12-06
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2016-06-04
相关资源
最近更新 更多