2016-05-28 4 views
3

を探す:私が見えるように結果が必要データがどのように見えるたとえば、各行のトップ3の最大値を持つ列名

df={'a1':[5,6,3,2,5],'a2':[23,43,56,2,6], 'a3':[4,2,3,6,7], 'a4':[1,2,1,3,2],'a5':[4,98,23,5,7],'a6':[5,43,3,2,5]} 
x=pd.DataFrame(df) 
Out[260]: 
    a1 a2 a3 a4 a5 a6 
0 5 23 4 1 4 5 
1 6 43 2 2 98 43 
2 3 56 3 1 23 3 
3 2 2 6 3 5 2 
4 5 6 7 2 7 5 

top1 top2 top3 
a2 a1 a6 
a5 a2 a6 
.... 

私は答えを見てきましたidxmaxを推奨する以前の質問(下記参照)と比較します。しかし、上位n個の値(n> 1)を処理する方法はありますか?

Find the column name which has the maximum value for each row

更新:

私は答えは非常に便利見つけるだけの事は、私のデータが長いので、それを回避する方法を把握する必要がされていることです。私はCSVファイルにデータを保存してから、それを再びチャンクに読み込みました。ここに私が使用したコードがあります:

data = pd.read_csv('xxx.csv', chunksize=1000) 
rslt = pd.DataFrame(np.zeros((0,3)), columns=['top1','top2','top3']) 
for chunk in data: 
    x=pd.DataFrame(chunk).T 
    for i in x.columns: 
     df1row = pd.DataFrame(x.nlargest(3, i).index.tolist(), index=['top1','top2','top3']).T 
     rslt = pd.concat([rslt, df1row], axis=0) 
rslt=rslt.reset_index(drop=True) 

答えて

2

必要なものはpandas.DataFrame.nlargestです。

import pandas as pd 
import numpy as np 

df={'a1':[5,6,3,2,5],'a2':[23,43,56,2,6], 'a3':[4,2,3,6,7], 'a4':[1,2,1,3,2],'a5':[4,98,23,5,7],'a6':[5,43,3,2,5]} 

x=pd.DataFrame(df).T 

rslt = pd.DataFrame(np.zeros((0,3)), columns=['top1','top2','top3']) 
for i in x.columns: 
    df1row = pd.DataFrame(x.nlargest(3, i).index.tolist(), index=['top1','top2','top3']).T 
    rslt = pd.concat([rslt, df1row], axis=0) 

print rslt 

Out[52]: 
    top1 top2 top3 
0 a2 a1 a6 
0 a5 a2 a6 
0 a2 a5 a1 
0 a3 a5 a4 
0 a3 a5 a2 
+0

これは素晴らしい機能です。ただ一つのこと:私の実際のデータセットはかなり大きく(長い、400K行以上)、本当に転置することはできません。私はそれを動作させるために、チャンクのデータをPythonに読み込もうとしていますが、この場合(大きなデータサイズ)、それを扱う他の方法はありますか? Thx – CWeeks

+0

@CWlearner、非常に大規模なデータセットの場合、チャンクの解決策は、純粋なpython pandasのアプローチでやってみたいと思うならば、私は考えることができます。 pandas](http://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas)。しかし、代わりにSQLを使用することを検討してみてください。これははるかに簡単です。 – 2342G456DI8

関連する問題