2017-08-22 18 views
8

Birkaç sütunda saklanan listeler içeren bir Pandalar DataFrame verildiğinde, her satır için en uzun listeyi içeren sütun adını bulmak için basit bir yol var mı? Bu verilerle ÖrneğinEn uzun listeyi içeren bir Pandalar DF'deki sütunun ismini bulun.

:

ben sıranın 1 ve "negatif" satır 2 ve 3.

I için en uzun liste ile sütun olarak "olumlu" tanımlamak istediğiniz

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

liste uzunluklarını hesaplamak için str.len() kullanabileceğimi ve sütun adlarını almak için idmax() kullanabileceğimi düşündüm, ancak bunların nasıl birleştirileceğini anlayamıyorum.

cevap

15

IIUC: Bunun

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

çok teşekkür ederiz! Hızlı takip: 'idxmax()', 'pozitif', 'negatif' ve 'nötr' tüm boş listeler olduğunda ilk endeksi (yani 'pozitif') döndürür. Bu çözüm, bu tür satırları yok saymak için değiştirilebilir mi? Boş listeleri NaN'lerle değiştirmeyi denedim, ancak 'len 'o zaman şikâyet ediyor:' '' float' 'nesnesinin nesnesi len()' 'değerine sahip değil. – user2950747

+0

@ user2950747, tekrarlanabilir bir veri seti sağlayabilir misiniz? – MaxU

+0

[bu örnek veri] (http://www.sharecsv.com/s/9dcf95cd39fa09eec291085eafecbd0c/polarity.csv) sondan üçüncü sırada boş listelere sahiptir ve "idxmax()" ile "pozitif" olarak etiketlenir. – user2950747

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

Yoksa bu deneyebilirsiniz ...

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') 
İlgili konular