2015-04-28 10 views
8

Bir Pandas veri karesinde kayan nokta verisi var. Her sütun bir değişkeni temsil eder (dizge adları vardır) ve her biri bir değerler kümesini sıralar (satırlar, önemli olmayan tamsayı adlarına sahiptir).Pandalar Dataframe'i log10 ölçeği x ekseni ile Çoklu Histogram olarak çizmek istiyorsunuz

>>> print data 
0  kppawr23 kppaspyd 
1  3.312387 13.266040 
2  2.775202 0.100000 
3 100.000000 100.000000 
4 100.000000 39.437420 
5  17.017150 33.019040 
... 

Her sütun için bir histogram çizmek istiyorum. Tek elde en iyi sonuç dataframe bir geçmiş yöntemi ile:

data.hist(bins=20) 

ama her bir histogramın x-ekseni, bir log 10 ölçekte istiyorum. Ve depolar da log10 ölçeğinde olmalı, ancak bu, bins = np.logspace (-2,2,20) ile yeterince kolaydır.

bir geçici çözüm log 10 komplo önce verileri dönüştürmek için olabilir, ama yaklaşımlar bana bir kayan nokta hata vermek,

data.apply(math.log10) 

ve

data.apply(lambda x: math.log10(x)) 

çalıştılar.

"cannot convert the series to {0}".format(str(converter))) 
TypeError: ("cannot convert the series to <type 'float'>", u'occurred at index kppawr23') 

cevap

5

Sen

ax.set_xscale('log') 

data.hist() eksen dizisi döndürür kullanabilirsiniz. Her bir eksen için ax.set_xscale('log')'u çağırmanız gerekir, ax, logaritmik olarak her bir ölçeklendirmesini yapmak için. Örneğin


,

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
np.random.seed(2015) 

N = 100 
arr = np.random.random((N,2)) * np.logspace(-2,2,N)[:, np.newaxis] 
data = pd.DataFrame(arr, columns=['kppawr23', 'kppaspyd']) 

bins = np.logspace(-2,2,20) 
axs = data.hist(bins=bins) 
for ax in axs.ravel(): 
    ax.set_xscale('log') 

plt.gcf().tight_layout() 
plt.show() 

DataFrame, data her değerinin logaritması için arada

enter image description here


, verir şunu kullanabilirsiniz

logdata = np.log10(data) 

için NumPy ufuncs (örneğin np.log10 gibi) bu elementwise on all the values in the DataFrame yapmaktadır, çünkü panda DataFrames uygulanabilir. apply, apply tüm sütun (dizi) değerlerini math.log10 olarak iletmeye çalıştığı için çalışmadı. math.log10 sadece bir skaler değer bekler.

data.apply(lambda x: math.log10(x)) aynı nedenle data.apply(math.log10) yapamaz. Ayrıca, data.apply(func) ve data.apply(lambda x: func(x))'un her ikisi de uygun seçenekler olsaydı, lambda fonksiyonu sadece aramayı biraz daha yavaşlatacağı için ilk tercih edilmelidir.

Sen NumPy ufunc np.log10 Serisi uygulanabilir tekrar beri data.apply(np.log10) kullanabilirsiniz, ancak bu zaman np.log10(data) işler yapmaya zahmet için hiçbir neden yoktur.

Ayrıca her değerin üzerinde data.applymap(math.log10) aramalar applymap beri math.log10 kullanabilirsiniz data tek-at-a-time. Ancak bu, DataFrame ürününün tamamında eşdeğer NumPy işlevi olan np.log10'u çağırmaktan çok daha yavaş olur. Yine de, numaralı telefonu arayarak ufaklık olmayan bazı özel işlevleri çağırmanız gerekiyorsa, applymap'u bilmeniz gerekir.

+0

Teşekkürler! Ravel() hakkında bilmiyordum. Ben de uyuşmadım. Pandalara odaklanmaya çalışıyorum çünkü büyük veri kümelerinde okumada çok hızlı olsaydı. –

+0

Bu arada, hızlandırmak için herhangi bir yolu var mı? Üretmek için 219 histogramım var ve birkaç dakika sürüyor (PyCharm topluluk baskısında hata ayıklama modunda çalışıyor). –

+0

Ve bir şekilde data.hist için tight_layout uygulayabilir miyim? –