簡體   English   中英

大熊貓可互換雙重索引?

[英]pandas interchangeable dual indexing?

我有一個DataFrame,我建立了一個雙重索引。 “開始”值在“結束”索引值中不存在,反之亦然。

c_weights.rename(columns={0:'start',1:'end',2:'metric',3:'angular',4:'special',5:'cos_pi'}, inplace=True)
c_weights.set_index(['start','end'],inplace=True)
c_weights.head()

df head()

我希望能夠調用類似的內容:c_weights.loc [1,638]或c_weights.loc [638,1]並獲取同一行數據。 為了清楚起見,這兩個索引組合始終是唯一的。 這怎么可能是骨頭?

無論如何,對於第一種情況,您可以使用ix索引並在行索引上傳遞一個元組

c_weights.ix[(1,638)]

在第二種情況下,我想這取決於您是否先掌握了結局,在這種情況下,我只會以正確的方式構造一個元組或將其反轉( (638,1)[::-1] = (1, 638)

直言不諱:由於您說自己具有互斥的開始和結束,因此您還可以使用以下列表理解

l = (start, end) # l = (end, start) returns the same
c_weights.ix[[x for x in c_weights.index if (x ==  l) or (x == l[::-1])]]

如果您還有唯一索引,則可以將其簡化為:

c_weights.ix[[x for x in c_weights.index if (x[0] ==  l[0]) or (x[1] == l[1])]]

數據幀是圍繞numpy ndarray的包裝,在其中分配行和列索引。 我們可以定義具有不同行或列索引的第二個數據幀,並訪問相同的ndarray。 例如,讓我們首先定義df1 ,然后使用相同的數據定義df2 ,但是交換MultiIndex行索引中的級別。 列保持不變。

import pandas as pd
import numpy as np

np.random.seed([3,1415])

df1 = pd.DataFrame(np.random.rand(4, 2),
                   pd.MultiIndex.from_product([('a', 'b'), (1, 2)]),
                   ['col1', 'col2'])
df2 = pd.DataFrame(df1.values, df1.index.swaplevel(0, 1), df1.columns)

print df1

         col1      col2
a 1  0.444939  0.407554
  2  0.460148  0.465239
b 1  0.462691  0.016545
  2  0.850445  0.817744

print df2

         col1      col2
1 a  0.444939  0.407554
2 a  0.460148  0.465239
1 b  0.462691  0.016545
2 b  0.850445  0.817744

我們可以看到數據是相同的,索引被交換了。 df1訪問數據與從df1到共可變點的數據相同。 讓我們在df1一些更改並查看df2

df1.loc[('a', 1), 'col1'] = 1.
print df2

         col1      col2
1 a  1.000000  0.407554
2 a  0.460148  0.465239
1 b  0.462691  0.016545
2 b  0.850445  0.817744

現在我們已經確信,讓我們觀察一下,現在我們有2個數據框,可以從中訪問相同的數據。 讓我們定義一個函數來執行OP的要求。

ambigui_t = lambda t: df1.loc[t] if t in df.index else df2.loc[t]

print ambigui_t(('a', 1))

col1    1.000000
col2    0.407554
Name: (a, 1), dtype: float64

print ambigui_t((1, 'a'))

col1    1.000000
col2    0.407554
Name: (1, a), dtype: float64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM