gpt4 book ai didi

python - Pandas 中惯用的多索引列分配

转载 作者:行者123 更新时间:2023-11-28 21:54:27 25 4
gpt4 key购买 nike

我有一个带有 2 级多索引的数据框:

ix = pd.MultiIndex.from_tuples(list(enumerate(np.random.choice(['A', 'B'], 5))))
df = pd.DataFrame({'Val': np.random.randint(0, 30, 5)}, index=ix).unstack().fillna(0)
df
Val
A B
0 27 0
1 0 3
2 0 7
3 9 0
4 0 19

我想为每个现有的子级别('A''B')添加一个等于Val 一半的列柱子。我的直觉是做

df['Half_val'] = df.Val / 2

给出一个 ValueError: Wrong number of items passed 2, placement implies 1异常。

我可以手动做

res = df.Val / 2
df.loc[:, ('Half_val', 'A')] = res.A
df.loc[:, ('Half_val', 'B')] = res.B

这给出了我所追求的:

>>> df
Val Half_val
A B A B
0 27 0 13.5 0.0
1 0 3 0.0 1.5
2 0 7 0.0 3.5
3 9 0 4.5 0.0
4 0 19 0.0 9.5

有没有更简洁、更惯用的方法来进行这样的多索引列分配(特别是我不必在左侧明确指定每个子级别的方法)?

编辑:

忘记说了

res = df.Val / 2
df.loc[:, res.columns] = res

给出 KeyError: "['A' 'B'] not in index"异常。

编辑 2如果解决方案允许数据框中的伪混合级别列,那就太好了。在我的例子中,我可以做到

In [5]: df['C'] = 'a'
In [6]: df
Out[6]:
Val C
A B
0 4 0 a
1 0 10 a
2 0 4 a
3 21 0 a
4 0 14 a

添加一个具有单一级别的列。但是由于该列已经有 2 个级别,它似乎给出了空字符串的隐式第二级别

In [9]: list(df)
Out[9]: [('Val', 'A'), ('Val', 'B'), ('C', '')]

当我尝试下面提供的解决方案时,它是单级 C专栏似乎打破了它:

In [7]: pd.concat([df,df['Val']/2],axis=1,keys=['Val', 'C', 'Half'])
==> AssertionError: Cannot concat indices that do not have the same number of levels

keys 有什么技巧吗?要传递的参数,还是我需要给出 C为第二层设置一个不同的虚拟值(因为它看起来像 "" 不算数),然后在串联后将其删除?

最佳答案

您可以遍历级别值并进行直接赋值(一次一个值)

In [55]: df.columns.get_level_values(1)
Out[55]: Index([u'A', u'B'], dtype='object')

In [51]: df[('Half','A')] = df[('Val','A')]/2

In [52]: df[('Half','B')] = df[('Val','B')]/2

In [53]: df
Out[53]:
Val Half
A B A B
0 0 12 0.0 6.0
1 0 5 0.0 2.5
2 0 26 0.0 13.0
3 3 0 1.5 0.0
4 25 0 12.5 0.0

你也可以这样做

In [59]: concat([df['Val'],df['Val']/2],axis=1,keys=['Val','Half'])
Out[59]:
Val Half
A B A B
0 0 10 0.0 5.0
1 0 10 0.0 5.0
2 0 13 0.0 6.5
3 27 0 13.5 0.0
4 2 0 1.0 0.0

这是一个跟踪此错误/增强功能的问题:https://github.com/pydata/pandas/issues/7475

关于python - Pandas 中惯用的多索引列分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com