【问题标题】:Pandas iterrows give result of only last rowPandas iterrows 只给出最后一行的结果
【发布时间】:2019-06-06 11:43:06
【问题描述】:

以下代码读取一个 csv 文件并遍历 'sub' 列的行:

df = pd.read_csv("Subs_test.csv", usecols= ['sub'])
for index, row in df.iterrows():
    subreddit = reddit.subreddit(row['sub']).subscribers
subreddit

我的问题:

它只给我最后一行的结果。 你能帮我看看这里发生了什么吗?

谢谢

【问题讨论】:

  • 因为你一直在循环中重新定义subreddit。一旦你离开循环,只有它的最后一个化身才能存活
  • 也许您在每次迭代时都覆盖了subreddit
  • ^^ 最后的化身 :D
  • 无论如何都不需要显式迭代。 df['sub']= df['sub'].apply(lambda x: reddit.subreddit(x).subscribers) 并删除 for 循环。无法在我的手机上进行测试,但我认为应该可以使用
  • 实际上,考虑一下,这可能会返回一个列表,所以也许你最好将它从 DF 中拉出来。我不知道API。如果它返回整数个订阅者,那么保留在 DF 中就可以了。

标签: python python-3.x pandas loops


【解决方案1】:

因为您在循环中设置了 subreddit。它总是等于最后一行

例如

In [1]: for i in range(10):
   ...:     a = i
   ...: a
Out[1]: 9

如果你想把值放到列表中,你可以使用这样的循环

df = pd.read_csv("Subs_test.csv", usecols= ['sub'])
subreddit = []
for index, row in df.iterrows():
    subreddit.append(reddit.subreddit(row['sub']).subscribers)
subreddit

或列表理解

subreddit = [reddit.subreddit(row['sub']).subscribers for index, row in df.iterrows()]
print(subreddit)

【讨论】:

  • 该死,猜你比我快;)
  • @Flob 没问题老兄,我已经为你的答案投票了 :) 它更正了,也很有用
【解决方案2】:

正如 cmets 中已经指出的那样,您在每次迭代期间重新定义 subreddit,这就是为什么在您的代码末尾,它的值仅是最后一行。我猜你想要的是所有行的列表,或者类似的东西。使用列表推导解决此问题:

subreddit = [reddit.subreddit(row['sub']).subscribers for index, row in df.iterrows()]

这将返回所有行的列表。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 2012-09-11
    • 1970-01-01
    • 2020-06-22
    • 2014-06-02
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多