我想在multiindex數據框(基本上是groupby描述數據框)上應用一個函數,而不使用for循環遍歷0級索引。pandas在multiindex上應用函數
功能我想申請:我的數據幀的
def CI(x):
import math
sigma = x["std"]
n = x["count"]
return 1.96 * sigma/math.sqrt(n)
樣品:
df = df.iloc[47:52, [3,4,-1]]
a b id
47 0.218182 0.000000 0d1974107c6731989c762e96def73568
48 0.000000 0.000000 0d1974107c6731989c762e96def73568
49 0.218182 0.130909 0d1974107c6731989c762e96def73568
50 0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432
51 0.000000 0.000000 0fd4f3b4adf43682f08e693a905b7432
,我和楠取代零:
df = df.replace(float(0), np.nan)
Groupy的ID和描述我得到了multiindex:
df_group = df.groupby("id").describe()
當前的解決方案,我不喜歡,認爲可以改進:
l_df = []
for column in df_group.columns.levels[0]:
df = pd.DataFrame({"CI" : df_group[column].apply(CI, axis = 1)})
l_df.append(df)
CI = pd.concat(l_df, axis = 1)
CI.columns = df_group.columns.levels[0]
,所以我得到這樣的:
a b
id
06f32e6e45da385834dac983256d59f3 nan nan
0d1974107c6731989c762e96def73568 0.005 0.225
0fd4f3b4adf43682f08e693a905b7432 0.008 nan
11e0057cdc8b8e1b1cdabfa8a092ea5f 0.018 0.582
120549af6977623bd01d77135a91a523 0.008 0.204
如此反覆,如果我有頂級列從A到Z ,並且每個都包含std和count列,那麼如何將我的函數同時應用於這些列?
謝謝約翰答覆。這是更短的解決方案,但原則上它只是重新解釋我的解決方案。我想知道在熊貓中是否有一種方法可以在多指標級別上運行,而不需要循環或列表解析。 – LostBoardOnTaurangaBeach
天才!這是我正在尋找的答案。你以爲我多次執行groupby是正常的,並且你認爲我如何遞歸地使用lambda。非常感激!您應該發佈答案,以便我可以獎勵您的積分(如果我理解獎勵系統正確 - 我是新的) – LostBoardOnTaurangaBeach
已添加爲答案。 – Zero