【发布时间】:2018-02-16 06:56:07
【问题描述】:
我想在多索引数据帧(基本上是 groupby 描述数据帧)上应用一个函数,而不使用 for 循环遍历 0 级索引。
我想申请的功能:
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
我用 nan 替换零:
df = df.replace(float(0), np.nan)
对 id 和描述进行分组,我得到多索引:
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 列,我如何将我的函数同时应用于这些列中的每一列?
【问题讨论】:
-
感谢约翰的回复。这是较短的解决方案,但原则上它只是改写我的解决方案。我想知道 pandas 中是否有一种方法可以在多索引级别上运行,而无需 for 循环或列表推导。
标签: python pandas multi-index