关于python:将一个列表或系列作为一行添加到pandas DataFrame中?

Appending a list or series to a pandas DataFrame as a row?

因此,我已经初始化了一个空的pandas数据帧,我想在这个数据帧中迭代地将列表(或序列)附加为行。最好的方法是什么?


有时,在熊猫外部执行所有附加操作会更容易,然后,只需一次创建数据帧。

1
2
3
4
5
6
7
>>> import pandas as pd
>>> simple_list=[['a','b']]
>>> simple_list.append(['e','f'])
>>> df=pd.DataFrame(simple_list,columns=['col1','col2'])
   col1 col2
0    a    b
1    e    f


下面是一个简单而愚蠢的解决方案:

1
2
3
>>> import pandas as pd
>>> df = pd.DataFrame()
>>> df = df.append({'foo':1, 'bar':2}, ignore_index=True)


1
2
df = pd.DataFrame(columns=list("ABC"))
df.loc[len(df)] = [1,2,3]


你能这样做吗?

1
2
3
4
5
6
7
8
>>> import pandas as pd
>>> df = pd.DataFrame(columns=['col1', 'col2'])
>>> df = df.append(pd.Series(['a', 'b'], index=['col1','col2']), ignore_index=True)
>>> df = df.append(pd.Series(['d', 'e'], index=['col1','col2']), ignore_index=True)
>>> df
  col1 col2
0    a    b
1    d    e

有人有更优雅的解决方案吗?


跟随迈克·奇里科的回答…如果要在数据帧已填充后附加列表…

1
2
3
4
5
6
7
>>> list = [['f','g']]
>>> df = df.append(pd.DataFrame(list, columns=['col1','col2']),ignore_index=True)
>>> df
  col1 col2
0    a    b
1    d    e
2    f    g


这里有一个函数,给定一个已经创建的数据帧,它将把一个列表作为新行附加。这可能会抛出错误捕捉器,但如果您确切知道要添加什么,那么它不应该是一个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
import numpy as np

def addRow(df,ls):
   """
    Given a dataframe and a list, append the list as a new row to the dataframe.

    :param df: <DataFrame> The original dataframe
    :param ls: <list> The new row to be added
    :return: <DataFrame> The dataframe with the newly appended row
   """


    numEl = len(ls)

    newRow = pd.DataFrame(np.array(ls).reshape(1,numEl), columns = list(df.columns))

    df = df.append(newRow, ignore_index=True)

    return df


如果要添加序列并将序列的索引用作数据帧的列,则只需在括号之间追加序列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [1]: import pandas as pd

In [2]: df = pd.DataFrame()

In [3]: row=pd.Series([1,2,3],["A","B","C"])

In [4]: row
Out[4]:
A    1
B    2
C    3
dtype: int64

In [5]: df.append([row],ignore_index=True)
Out[5]:
   A  B  C
0  1  2  3

[1 rows x 3 columns]

如果去掉ignore_index=True,就得不到合适的索引。


最简单的方法:

1
2
my_list = [1,2,3,4,5]
df['new_column'] = pd.Series(my_list).values

编辑:

不要忘记新列表的长度应该与对应的数据帧的长度相同。


只需使用loc:

1
2
3
4
5
6
7
8
>>> df
     A  B  C
one  1  2  3
>>> df.loc["two"] = [4,5,6]
>>> df
     A  B  C
one  1  2  3
two  4  5  6