2016-05-17 179 views
0

我有一個多索引熊貓數據框的數值。我希望使用其他兩個數據子集對數據框子集中的每一行進行排序。我相信下面的例子會更好地說明我需要什麼:多索引熊貓DataFrame順序排序

考慮這個例子的數據集:

      A   B   C   D 
rtr 2015-01-31 -1.085631 -0.204201 1.730024 1.710438 
    2015-02-28 0.997345 1.979348 1.232650 -0.056341 
key1 2015-01-31 6.180000 0.990000 2.440000 1.920000 
    2015-02-28 1.140000 1.810000 4.560000 0.740000 
key2 2015-01-31 86.000000 36.000000 61.000000 34.000000 
    2015-02-28 97.000000 96.000000 48.000000 98.000000 

考慮的key1的最後一行,key2rtr下日期2015-02-28

  1. df.loc['key1']中,獲取2個最大值的列名。 (即:C,B)
  2. 從列空間中排除C和B列。 (即:cols剩餘:A,D)
  3. in df.loc['key2'],獲取剩餘列空間中最大值的列名稱。 (即:在列A和d值,d是較大的 - >返回d)
  4. 取對應的值從df.loc['rtr']對應於在步驟1和3(即發現的列名:返回值df.loc['rtr'].loc['20150228',['C','B','D']]
In [140]: df.loc['rtr'].loc['20150228',['C','B','D']] 
Out[140]: 
C 1.232650 
B 1.979348 
D -0.056341 
Name: 2015-02-28 00:00:00, dtype: float64 

例如數據生成代碼:

## generate data: 
d1,d2,d3 = {},{},{} 
np.random.seed(123) 
for col in list("ABCD"): 
    d1[col] = np.random.randn(2) 
    d2[col] = np.random.gamma(2,3,2).round(2) 
    d3[col] = np.random.random_integers(0,100, 2) 
t_index = pd.date_range(start = '2015-01-31', periods = 2, freq = "M") 

dat1 = pd.DataFrame(d1, index = t_index) 
dat2 = pd.DataFrame(d2, index = t_index) 
dat3 = pd.DataFrame(d3, index = t_index) 

df = pd.concat([dat1, dat2, dat3], keys = ['rtr', 'key1', 'key2']) 
+0

它仍然不清楚你想要什麼。 – piRSquared

+0

你好,你能否澄清哪一部分不清楚? –

+1

您對僅適用於'2015-01-31'的示例數據應用了星號。提供一個更好的理解預期產出會是什麼樣子會有所幫助。當我看到需要回答的問題時,我會對我認爲需要多長時間回答問題作出判斷。然後我平衡這與我目前的工作量。最後,如果我在閱讀這個問題時my目結舌,我會跳過它。讓人們儘可能容易地閱讀和理解,這對你最有利。 – piRSquared

回答

1

步驟1:解決給定日期的問題。

df1 = df.xs('2015-01-31', level=1) 

columns = df1.loc['key1'].nlargest(2).index.tolist() 
columns.append(df1.loc['key2'][df.columns.difference(columns)].idxmax()) 
df1.loc['rtr', columns] 

我們使用nlargest和拍攝效果的指標,因爲idxmax只適用於一個最大值。我們在下面一行中使用idxmax,排除之前列有大熊貓索引difference方法的列。

步驟2:使用groupby將上述解決方案分別應用於每個日期。

def func(df2): 
    df1 = df2.reset_index(level=1, drop=True) 
    columns = df1.loc['key1'].nlargest(2).index.tolist() 
    columns.append(df1.loc['key2'][df.columns.difference(columns)].idxmax()) 
    return df1.loc['rtr', columns] 

df.groupby(level=1).apply(func) 

reset_index增加,因爲在與xs相反,groupby不下降的指數水平。

+1

優秀的解決方案!我可能會決定在第二步中使用'nlargest(m).index.tolist()',因爲這是爲了推廣到一個更大的數據集和每個鍵的多個選擇。我從來沒有想過要使用'groupby',因爲我一直在與'np.argsort'和'df.apply'戰鬥。感謝代碼! –