下面是一个for循环:
for i in links:
data = urllib2.urlopen(str(i)).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
这样创建的每个 Dataframe 都有与其他 Dataframe 相同的大部分列,但不是所有列。此外,它们都只有一行。我需要做的是将for循环产生的每个 Dataframe 的所有不同列和每行添加到 Dataframe 中
我试过pandas concatenate或类似的,但似乎没有工作。任何想法?谢谢。
5条答案
按热度按时间mbjcgjjk1#
假设你的数据看起来像这样:
那么它可以被替换为
换句话说,不要为每一行创建一个新的DataFrame,而是收集一个字典列表中的所有数据,然后在循环结束时调用
df = pd.DataFrame(data)
一次。每次调用
df.append
都需要为一个新的DataFrame分配额外的一行空间,将原始DataFrame中的所有数据复制到新的DataFrame中,然后将数据复制到新行。所有这些分配和复制使得在循环中调用df.append
非常低效。复制grows quadratically的时间成本与行数有关。不仅调用-DataFrame-一旦代码更容易编写,它的性能就会更好--复制的时间成本随着行数的增加而线性增长。dluptydi2#
在循环中追加行有两个原因,1.添加到现有df,2.创建新df。
要创建一个新的df,我认为它是有据可查的,你应该创建你的数据作为一个列表,然后创建 Dataframe :
或者,创建带有索引的 Dataframe ,然后向其中添加
如果你想添加到一个现有的dataframe中,你可以使用上面的方法,然后将df附加在一起(有或没有索引):
或者,你也可以创建一个字典条目列表,并像上面的答案那样附加这些条目。
使用dict(zip(cols,vals))
包括下面评论中的想法:
事实证明,Pandas确实有一种有效的方法来附加到 Dataframe :
(this)将“append”到一个dataframe的末尾。- Demis 3月22日15:32
tf7tbtn23#
一个更简单、更有效的方法可能是:
输出将是:
wfsdck304#
我在for循环中创建了一个临时的空 Dataframe ,因为每次for循环的迭代都会创建一个新的 Dataframe ,从而覆盖上一次迭代的内容。
因此,我需要将 Dataframe 的内容移动到已经创建的空 Dataframe 中。就这么简单。我们只需要使用.append函数,如下所示:
在for循环之外,您可以将临时数据框的内容复制到主数据框中,然后在不需要临时数据框时将其删除
bt1cpqcv5#
首先,创建一个带有列名的空DataFrame,之后,在for循环中,您必须定义一个字典(一行),其中包含要追加的数据:
如果你想添加一行多列,代码如下所示:
Source