如何在for循环中追加pandas Dataframe 中的行?

yebdmbv4  于 2023-03-28  发布在  其他
关注(0)|答案(5)|浏览(506)

下面是一个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或类似的,但似乎没有工作。任何想法?谢谢。

mbjcgjjk

mbjcgjjk1#

假设你的数据看起来像这样:

import pandas as pd
import numpy as np

np.random.seed(2015)
df = pd.DataFrame([])
for i in range(5):
    data = dict(zip(np.random.choice(10, replace=False, size=5),
                    np.random.randint(10, size=5)))
    data = pd.DataFrame(data.items())
    data = data.transpose()
    data.columns = data.iloc[0]
    data = data.drop(data.index[[0]])
    df = df.append(data)
print('{}\n'.format(df))
# 0   0   1   2   3   4   5   6   7   8   9
# 1   6 NaN NaN   8   5 NaN NaN   7   0 NaN
# 1 NaN   9   6 NaN   2 NaN   1 NaN NaN   2
# 1 NaN   2   2   1   2 NaN   1 NaN NaN NaN
# 1   6 NaN   6 NaN   4   4   0 NaN NaN NaN
# 1 NaN   9 NaN   9 NaN   7   1   9 NaN NaN

那么它可以被替换为

np.random.seed(2015)
data = []
for i in range(5):
    data.append(dict(zip(np.random.choice(10, replace=False, size=5),
                         np.random.randint(10, size=5))))
df = pd.DataFrame(data)
print(df)

换句话说,不要为每一行创建一个新的DataFrame,而是收集一个字典列表中的所有数据,然后在循环结束时调用df = pd.DataFrame(data)一次。
每次调用df.append都需要为一个新的DataFrame分配额外的一行空间,将原始DataFrame中的所有数据复制到新的DataFrame中,然后将数据复制到新行。所有这些分配和复制使得在循环中调用df.append非常低效。复制grows quadratically的时间成本与行数有关。不仅调用-DataFrame-一旦代码更容易编写,它的性能就会更好--复制的时间成本随着行数的增加而线性增长。

dluptydi

dluptydi2#

在循环中追加行有两个原因,1.添加到现有df,2.创建新df。
要创建一个新的df,我认为它是有据可查的,你应该创建你的数据作为一个列表,然后创建 Dataframe :

cols = ['c1', 'c2', 'c3']
lst = []
for a in range(2):
    lst.append([1, 2, 3])
df1 = pd.DataFrame(lst, columns=cols)
df1
Out[3]: 
   c1  c2  c3
0   1   2   3
1   1   2   3

或者,创建带有索引的 Dataframe ,然后向其中添加

cols = ['c1', 'c2', 'c3']
df2 = pd.DataFrame(columns=cols, index=range(2))
for a in range(2):
    df2.loc[a].c1 = 4
    df2.loc[a].c2 = 5
    df2.loc[a].c3 = 6
df2
Out[4]: 
  c1 c2 c3
0  4  5  6
1  4  5  6

如果你想添加到一个现有的dataframe中,你可以使用上面的方法,然后将df附加在一起(有或没有索引):

df3 = df2.append(df1, ignore_index=True)
df3
Out[6]: 
  c1 c2 c3
0  4  5  6
1  4  5  6
2  1  2  3
3  1  2  3

或者,你也可以创建一个字典条目列表,并像上面的答案那样附加这些条目。

lst_dict = []
for a in range(2):
    lst_dict.append({'c1':2, 'c2':2, 'c3': 3})
df4 = df1.append(lst_dict)
df4
Out[7]: 
   c1  c2  c3
0   1   2   3
1   1   2   3
0   2   2   3
1   2   2   3

使用dict(zip(cols,vals))

lst_dict = []
for a in range(2):
    vals = [7, 8, 9]
    lst_dict.append(dict(zip(cols, vals)))
df5 = df1.append(lst_dict)

包括下面评论中的想法:
事实证明,Pandas确实有一种有效的方法来附加到 Dataframe :

df.loc[ len(df) ] = [new, row, of, data]

(this)将“append”到一个dataframe的末尾。- Demis 3月22日15:32

tf7tbtn2

tf7tbtn23#

一个更简单、更有效的方法可能是:

cols = ['frame', 'count']
N = 4
dat = pd.DataFrame(columns = cols)
for i in range(N):

    dat = dat.append({'frame': str(i), 'count':i},ignore_index=True)

输出将是:

>>> dat
   frame count
0     0     0
1     1     1
2     2     2
3     3     3
wfsdck30

wfsdck304#

我在for循环中创建了一个临时的空 Dataframe ,因为每次for循环的迭代都会创建一个新的 Dataframe ,从而覆盖上一次迭代的内容。
因此,我需要将 Dataframe 的内容移动到已经创建的空 Dataframe 中。就这么简单。我们只需要使用.append函数,如下所示:

temp_df = pd.DataFrame() #Temporary empty dataframe
for sent in Sentences:
    New_df = pd.DataFrame({'words': sent.words}) #Creates a new dataframe and contains tokenized words of input sentences
    temp_df = temp_df.append(New_df, ignore_index=True) #Moving the contents of newly created dataframe to the temporary dataframe

在for循环之外,您可以将临时数据框的内容复制到主数据框中,然后在不需要临时数据框时将其删除

bt1cpqcv

bt1cpqcv5#

首先,创建一个带有列名的空DataFrame,之后,在for循环中,您必须定义一个字典(一行),其中包含要追加的数据:

df = pd.DataFrame(columns=['A'])
for i in range(5):
    df = df.append({'A': i}, ignore_index=True)
df
   A
0  0
1  1
2  2
3  3
4  4

如果你想添加一行多列,代码如下所示:

df = pd.DataFrame(columns=['A','B','C'])
for i in range(5):
    df = df.append({'A': i,
                    'B': i * 2,
                    'C': i * 3,
                   }
                   ,ignore_index=True
                  )
df
    A   B   C
0   0   0   0
1   1   2   3
2   2   4   6
3   3   6   9
4   4   8   12

Source

相关问题