2017-08-22 4 views
8

複数の列に格納されたリストを持つPandas DataFrameを考えると、各列の最長リストを含む列名を簡単に見つける方法はありますか?例えば最も長いリストを含むPandas DFの列の名前を見つけよう

、このデータを用いて:

      positive     negative   neutral 
1 [marvel, moral, bold, destiny]      [] [view, should] 
2      [beautiful]  [complicated, need]    [] 
3      [celebrate] [crippling, addiction]   [big] 

私は行2及び3

最長行1のためのリストおよび「陰性」と列として「正」を識別します私はstr.len()を使ってリストの長さを計算し、idmax()を使って列名を得ることができたと思ったが、それらを組み合わせる方法は分からなかった。

答えて

15

IIUC:

In [227]: df.applymap(len).idxmax(axis=1) 
Out[227]: 
0 positive 
1 negative 
2 negative 
dtype: object 
+0

多くの感謝!速いフォローアップ: 'idxmax()'は、 'positive'、 'negative'、 'neutral'がすべて空のリストである場合、最初のインデックス(つまり 'positive')を返します。このような行を無視するようにこのソリューションを修正できますか?私は空のリストをNaNで置き換えようとしましたが、 'len'は' 'float '型のオブジェクトにlen()" 'がありません。 – user2950747

+0

@ user2950747、再現可能なデータセットを提供できますか? – MaxU

+0

[このサンプルデータ](http://www.sharecsv.com/s/9dcf95cd39fa09eec291085eafecbd0c/polarity.csv)は、最後から3行目に空のリストを持ち、 'idxmax()'によって 'positive'と表示されます。 – user2950747

5
>>> df.apply(lambda row: row.apply(len).argmax(), axis=1) 
0 positive 
1 negative 
2 negative 
dtype: object 
2

それともあなたはこれを試すことができます...このため

df=df.reset_index() 
DF=pd.melt(df,id_vars=['index']) 
DF['Length']=DF['value'].apply(lambda x : len(x)) 
DF.sort_values(['index','Length']).drop_duplicates(subset=['index'],keep='last') 
関連する問題