Pandas使用两个索引将行附加到dataframe

时间:2015-07-09 13:39:35

标签: python pandas

我真的很难潜入大熊猫:

这里我想用双索引建立一个这样的DataFrame:i1和i2:

cols = ["i1", "i2", "d1", "d2", "d3"]
T = pd.DataFrame( columns=cols ).set_index(["i1", "i2"])

然后将行附加到右侧索引

的行 到目前为止,我已经尝试过了:

T.loc[ 1,2 ] = pd.Series({"d1":10, "d2":20, "d3":30})

还有:

T.append( pd.Series({"d1":10, "d2":20, "d3":30}, name=(1,2)) )

没有一个能给出理想的结果。

2 个答案:

答案 0 :(得分:1)

首次尝试以下作品:

In [258]:
T.loc(axis=0)[ (1,2) ] = pd.Series({"d1":10, "d2":20, "d3":30})
T

Out[258]:
       d1  d2  d3
i1 i2            
1  2   10  20  30

这个T.append( pd.Series({"d1":10, "d2":20, "d3":30}, name=(1,2)) )在pandas 0.16.2

中也可以正常使用

答案 1 :(得分:1)

如果您执行T.loc[(1,2),:]而不是T.loc[ 1,2 ],则第一个选项有效(因此pandas知道两个值都是行索引(对于两个行索引级别):

In [63]: T = pd.DataFrame( columns=cols ).set_index(["i1", "i2"])

In [64]: T.loc[( 1,2),: ] = pd.Series({"d1":10, "d2":20, "d3":30})

In [65]: T
Out[65]:
       d1  d2  d3
i1 i2
1  2   10  20  30

更详尽的解释:T.loc[ 1,2 ]将尝试访问第1行和第2列。因此,您需要将(1,2)作为元组传递,并使用:明确选择所有列,并赋予{ {1}}。

第二个适用于我(使用pandas 0.16.2):

.loc[(1,2),:]

但是,请注意,以这两种方式追加值将始终采用现有帧的副本 最好重新考虑您的方法并立即使用数据创建数据框(当然,这取决于您的应用程序)。