2013-03-15 121 views
1

目標:將列添加到由標籤的數據幀如下:數據幀操縱

(-10,5]=-2 

(-5,0]= -1 

[0,5) = 0 

[5,10)= 1 

[10,15)= 2 

....等

如果df.ptdelta(-10,5]之間它接收-2加入到柱的df

嘗試1:

df=pd.read_csv("___.csv",names="a b c d e f".split()) 
df.set_index(["a", "b"], inplace=True) 
d=df["d"]<5 
u=df["d"]>=0 

p=df["d"][d & u] 

這似乎找不到實例:Series([], dtype=object)

但確實有這個範圍內雙打df["d"]

嘗試2:

zero=[x for x in df["d"] if (0<=df["d"]) & (df["d"]<5)] 

導致:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

爲什麼無論這些失敗?非常感謝。

df.head() gives: 

     price ptdelta  II pl 
date time     
date time price ptdelta II pl 
1/5/2009 930  842  0 - 0 
      1620 845.2 3.2  - 6.6 
1/6/2009 930  851.8 6.6  -  -3.6 
      1620 848.2 -3.6 - -13 

回答

0

您正在裝箱數據並用bin標記。令人高興的是,​​可以爲你做到這一點。

bins = [-10, -5, 0, 5, 10, 15] 
labels = np.digitize(data, bins) - 3 

實施例:

In[1]: df = DataFrame({'d': np.random.randint(-20, 20, 100)}) 

In[2]: bins = [-10, -5, 0, 5, 10, 15] 

In[3]: df['labels'] = np.digitize(df['d'], bins) - 3 

In[4]: df.head() 
Out[4]: 
    d labels 
0 -8  -2 
1 4  0 
2 -7  -2 
3 -3  -1 
4 5  1 

這些箱被關閉左側,如[-10,5)。我認爲你指定的箱子不是自洽的。 (我應該將0標記爲-1還是0?)無論如何,如果邊界情況至關重要,請參閱文檔以獲取更多選項。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

大於15小於-10或更大的任何數據點將被分別標記爲-3和3。如果需要的話,你可以丟棄它們。

+0

感謝您的想法。看起來df ['d']對我的現​​有df [「d」]不是很好(包括雙精度):「TypeError:數組不能安全地轉換爲所需的類型」我試圖將它轉換爲列表,沒有工作。另外爲什麼你減去3? – 2013-03-15 20:57:01

+0

''np.digitize''標記從1開始的bin。你標記從-2開始的bin。 – 2013-03-15 21:01:19

+0

我不知道該怎麼做的錯誤。你可以發佈''df.head()''的輸出嗎? – 2013-03-15 21:02:01