python - Pandas 在多索引上应用函数

标签 python pandas multi-index

我想在多索引数据帧(基本上是 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)

Groupy 在 id 和 describe 上,我得到了多索引:
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 列,那么我如何同时将我的函数应用于这些列中的每一个?

最佳答案

使用 groupbylevelaxis=1 ,让我们迭代并应用第一级列。

In [104]: (df.groupby("id").describe()
             .groupby(level=0, axis=1)
             .apply(lambda x: x[x.name].apply(CI, axis=1)))
Out[104]:
                                    a   b
id
0d1974107c6731989c762e96def73568  0.0 NaN
0fd4f3b4adf43682f08e693a905b7432  NaN NaN

事实上,你不需要CI ,如果你要
In [105]: (df.groupby("id").describe()
             .groupby(level=0, axis=1).apply(lambda x: x[x.name]
             .apply(lambda x: 1.96*x['std']/np.sqrt(x['count']), axis=1)))
Out[105]:
                                    a   b
id
0d1974107c6731989c762e96def73568  0.0 NaN
0fd4f3b4adf43682f08e693a905b7432  NaN NaN

sample df
In [106]: df
Out[106]:
           a         b                                id
47  0.218182       NaN  0d1974107c6731989c762e96def73568
48       NaN       NaN  0d1974107c6731989c762e96def73568
49  0.218182  0.130909  0d1974107c6731989c762e96def73568
50       NaN       NaN  0fd4f3b4adf43682f08e693a905b7432
51       NaN       NaN  0fd4f3b4adf43682f08e693a905b7432

关于python - Pandas 在多索引上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46097992/

相关文章:

python - Django queryset获取values()中的所有字段加上外键字段

python - groupby pandas 期间的异常

Python/Pandas - 基于多个条件的新列

python - 使用一致的映射跨数据框列分解值

python - 使用 MultiIndex 列在 pandas 数据框中添加一个字段

python - 如何检查存储为字符串的条件?我需要解析器吗?

python - 我无法在 Linux 中终止我的 Python 脚本

python - fillna 与 nametuple 或任何其他类 pandas

python - 如何使用多索引加速 pandas 的索引?

c++ - Boost 多索引有序迭代器分配