2016-03-11 28 views
1

我的數據框看起來是這樣的:入門n個最小在熊貓數據幀行

  A B C D 
date     
2015-01-01 1 1 2 3 
2015-01-02 1 2 3 3 
2015-01-03 1 2 1 3 
2015-01-04 3 2 1 1 
2015-01-05 3 2 2 1 
2015-01-06 1 1 2 3 
2015-01-07 1 2 3 3 
2015-01-08 1 2 1 3 
2015-01-09 3 2 1 1 
2015-01-10 3 2 2 1 
2015-01-11 3 2 2 1 

基本規則:我想這些標識每一行的2個最小值和設定值設置爲1的其他值應設置爲0。

附加規則:

1 1 1 1 should be 1 1 1 1 
1 2 2 2 should be 1 1 1 1 
1 2 2 3 should be 1 1 1 0 
1 2 3 4 should be 1 1 0 0 

我希望你能遵守規則,並在開始數據幀的結果應該是

date  A B C D 
2015-01-01 1 1 0 0 
2015-01-02 1 1 0 0 
2015-01-03 1 0 1 0 
2015-01-04 0 0 1 1 
2015-01-05 0 1 1 1 
2015-01-06 1 1 0 0 
2015-01-07 1 1 0 0 
2015-01-08 1 0 1 0 
2015-01-09 0 0 1 1 
2015-01-10 0 1 1 1 
2015-01-11 0 1 1 1 

編輯

「也許你想用方法秩= '第一',我認爲這會工作 - EdChum」 結果爲數據幀:

  A B C D 
date     
2015-01-01 1 2 3 4 
2015-01-02 1 2 3 4 
2015-01-03 1 3 2 4 
2015-01-04 4 3 1 2 
2015-01-05 4 2 3 1 
2015-01-06 1 2 3 4 
2015-01-07 1 2 3 4 
2015-01-08 1 3 2 4 
2015-01-09 4 3 1 2 
2015-01-10 4 2 3 1 
2015-01-11 4 2 3 1 

回答

2

如果你想延長過去的4列,也許你可以嘗試類似下面的方法,以前的解決方案的面具創意也是我將實現它的方式,但是你可以指定你想要兩個最小的值:

mask = df.apply(lambda x: x.isin(x.nsmallest(2)), axis=1) 
df[mask] = 1 
df[~mask] = 0 
df 

      A B C D 
2015-01-01 1 1 0 0 
2015-01-02 1 1 0 0 
2015-01-03 1 0 1 0 
2015-01-04 0 0 1 1 
2015-01-05 0 1 1 1 
2015-01-06 1 1 0 0 
2015-01-07 1 1 0 0 
2015-01-08 1 0 1 0 
2015-01-09 0 0 1 1 
2015-01-10 0 1 1 1 
2015-01-11 0 1 1 1 

我擔心對大數據集這個解決方案的性能,但它應該得到你正在尋找

3

我覺得這做你想做的事:

In [3]: 
mask = df.rank(method='dense', axis=1) <= 2 
df[mask] = 1 
df[~mask] = 0 
df 

Out[3]: 
      A B C D 
date     
2015-01-01 1 1 1 0 
2015-01-02 1 1 0 0 
2015-01-03 1 1 1 0 
2015-01-04 0 1 1 1 
2015-01-05 0 1 1 1 
2015-01-06 1 1 1 0 
2015-01-07 1 1 0 0 
2015-01-08 1 1 1 0 
2015-01-09 0 1 1 1 
2015-01-10 0 1 1 1 
2015-01-11 0 1 1 1 

這將返回一個rank的行值和傳遞method='dense'將按照第一次看到的價值排名,並增加1看到一個新的組時,您可以將2更改爲任何n值和排名是獨立的無論行中的值是否是整數和連續的。

+0

大問題的答案卻是有可能得到可以處理n個更廣泛的解決方案:日最低值(在上例中n = 2),可以處理多於4列? – Jonas

+0

我意識到這隻適用於行中值的總數等於大小除以'n'的屬性,更通用的解決方案將涉及使用'apply'我想,但它不會被矢量化對於大型dfs會很慢 – EdChum

+0

這些值是否始終爲整數且從1到4? – EdChum