在Pandas DataFrame中插入数据时不带索引或列的开销(不使用concat或append)
考虑以下这个示例数据框:
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.concat
或 DataFrame.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]
我觉得这样做会把整个数据都复制一遍,所以不要重复这样做。