在Pandas DataFrame中插入数据时不带索引或列的开销(不使用concat或append)

2 投票
1 回答
8235 浏览
提问于 2025-04-18 01:55

考虑以下这个示例数据框:

In [227]: dfrm
Out[227]: 
          A         B         C  D           E
0  0.531428  0.045863  0.848619  1  2012-11-01
1  0.723965  0.508678  0.342828  2  2012-11-02
2  0.173907  0.962761  0.918959  2  2012-11-03
3  0.280061  0.067503  0.277317  1  2012-11-04
4  0.107908  0.949389  0.192078  1  2012-11-05
5  0.029907  0.240504  0.151579  1  2012-12-01
6  0.633516  0.217710  0.491811  2  2012-12-02
7  0.983545  0.450685  0.381446  1  2012-12-03
8  0.587426  0.833778  0.058891  2  2012-12-04
9  0.184342  0.664248  0.220923  1  2012-12-05

In [228]: dfrm.set_index(['E', 'D'])
Out[228]: 
                     A         B         C
E          D                              
2012-11-01 1  0.531428  0.045863  0.848619
2012-11-02 2  0.723965  0.508678  0.342828
2012-11-03 2  0.173907  0.962761  0.918959
2012-11-04 1  0.280061  0.067503  0.277317
2012-11-05 1  0.107908  0.949389  0.192078
2012-12-01 1  0.029907  0.240504  0.151579
2012-12-02 2  0.633516  0.217710  0.491811
2012-12-03 1  0.983545  0.450685  0.381446
2012-12-04 2  0.587426  0.833778  0.058891
2012-12-05 1  0.184342  0.664248  0.220923

In [229]: dfrm.set_index(['E', 'D']).A.unstack(level=1)
Out[229]: 
D                  1         2
E                             
2012-11-01  0.531428       NaN
2012-11-02       NaN  0.723965
2012-11-03       NaN  0.173907
2012-11-04  0.280061       NaN
2012-11-05  0.107908       NaN
2012-12-01  0.029907       NaN
2012-12-02       NaN  0.633516
2012-12-03  0.983545       NaN
2012-12-04       NaN  0.587426
2012-12-05  0.184342       NaN

现在,假设在这个最后的例子中,我想在数据框的最上面添加一行新的数据,这一行将成为第一行。

我会为它设置一个索引值,比如说 datetime.date(2012, 10, 30),这样它就会稍微早于现有的第一行。然后我会传入一个包含两个值的列表,比如 [0.0, 0.0],作为这一行的值。

我想知道怎么能把这个结构直接加到数据框的顶部,而不需要构建一个临时结构,确保它的列名和索引名都一样。

我希望输出的结果是:

D                  1         2
E           
2012-10-30  0.000000  0.000000          
2012-11-01  0.531428       NaN
2012-11-02       NaN  0.723965
2012-11-03       NaN  0.173907
2012-11-04  0.280061       NaN
2012-11-05  0.107908       NaN
2012-12-01  0.029907       NaN
2012-12-02       NaN  0.633516
2012-12-03  0.983545       NaN
2012-12-04       NaN  0.587426
2012-12-05  0.184342       NaN

而且不需要手动创建像这样的临时结构:

pandas.DataFrame({"E":[datetime.date(2012, 10, 30)], 
                    1:[0.0], 
                    2:[0.0]).set_index("E")

(还要折腾列索引的名字 "D"),然后使用 pandas.concatDataFrame.append 来合并数据。

我想要的是一种可以直接“插入”数据的方法——只需要确保传入的值是正确的格式,第一项是索引,后面的项是各列的值,不需要任何列名或索引结构。

我在大量搜索中没有找到 pandas 中有这样的功能。

假设这个功能叫 insert_row,我希望能有一种接口可以做到这一点:

data_frame.insert_row((datetime.date(2012, 10, 30), 0.0, 0.0))

我可以通过重新排序索引把它放到最上面,但主要是我想提供一个正确格式的 tuple,其中第一个元素被视为索引,后面的元素被视为位置列,不需要列名或索引结构。

1 个回答

1

使用 DataFrame.ix[index] = row 可以添加一行数据。

import pandas as pd
df = pd.DataFrame({"A":[1,2,3], "B":[4,5,6]}, index=list("xyz"))
df.ix["t"] = [10, 20]

我觉得这样做会把整个数据都复制一遍,所以不要重复这样做。

撰写回答