2014-11-16 18 views
0

我想應用一個函數來爲每一行在pandas中對數據幀的slice進行排序,併爲每一行返回一個數據幀,其中計算了所計算的片段的值和數量。 因此,例如如何在pandas切片上應用lambda函數,並返回與輸入數據幀相同的格式?

df = pandas.DataFrame(numpy.round(numpy.random.normal(size=(2, 10)),2)) 
f = lambda x: (x - x.mean()) 

我想是拉姆達函數f應用列0-5,從5列到10 我這樣做:

a = pandas.DataFrame(f(df.T.iloc[0:5,:]) 

但是這僅僅是對第一個切片......如何在代碼中包含第二個切片,以便我的結果輸出幀與輸入幀完全一樣 - 只是每個數據點都會更改爲其值減去相應切片的平均值。

我希望它是有道理的..什麼是正確的方式與此?

謝謝。

+0

我在想,我能爲第二層'B = pandas.DataFrame(F做同樣的(df.T.iloc [5 ::,:])'然後將兩個幀連接起來,然後再次轉置,但是'concat'需要列表或字典而不是DataFrame .. – oaklander114

+0

你可以編輯你提供的'df',它會拋出'SyntaxError' – Anzel

+0

好吧,我做了,忘了支架。謝謝 – oaklander114

回答

1

您可以將結果簡單地重新分配到原df,像這樣:

import pandas as pd 
import numpy as np 


# I'd rather use a function than lambda here, preference I guess 
def f(x): 
    return x - x.mean() 


df = pd.DataFrame(np.round(np.random.normal(size=(2,10)), 2)) 

df.T 
     0  1 
0 0.92 -0.35 
1 0.32 -1.37 
2 0.86 -0.64 
3 -0.65 -2.22 
4 -1.03 0.63 
5 0.68 -1.60 
6 -0.80 -1.10 
7 -0.69 0.05 
8 -0.46 -0.74 
9 0.02 1.54 

# makde a copy of df here 
df1 = df 

# just reassign the slices back to the copy 
# edited, omit DataFrame part. 
df1.T[:5], df1.T[5:] = f(df.T.iloc[0:5,:]), f(df.T.iloc[5:,:]) 

df1.T 
     0  1 
0 0.836 0.44 
1 0.236 -0.58 
2 0.776 0.15 
3 -0.734 -1.43 
4 -1.114 1.42 
5 0.930 -1.23 
6 -0.550 -0.73 
7 -0.440 0.42 
8 -0.210 -0.37 
9 0.270 1.91 
+0

這適用於第一個切片的功能。 Ĵ ust以相同的方式重新應用第二個切片上的功能。是否是這樣做的最佳方法? 'df.T [5:] = pd.DataFrame(f(df.T.iloc [5:,:]))' – oaklander114

+0

但是如果你製作'[5:]',你的意思是你想要新的數據並計算一個新的'xx.mean()'?由於索引** 5 **重疊 – Anzel

+0

讓我們來看看..我想將該函數應用於第0,1,2,3,4列上的切片,然後是5,6,7,8,9。但是,我希望該函數能夠在原始數據上運行,其中平均值僅從第一輪中的前5輪開始,然後在第二輪中的最後5輪中進行。那有意義嗎? – oaklander114

相關問題