设置值多索引 Pandas

Posted

技术标签:

【中文标题】设置值多索引 Pandas【英文标题】:Set value multiindex Pandas 【发布时间】:2014-05-31 07:02:22 【问题描述】:

我是 Python 和 Pandas 的新手。

我正在尝试构建一个数据框,然后用值填充它。

我已经构建了我的数据框

from pandas import *

ageMin = 21
ageMax = 31
ageStep = 2

bins_sumins = [0, 10000, 20000]
bins_age = list(range(ageMin, ageMax, ageStep))
indeks_sex = ['M', 'F']
indeks_age  =  ['[0-1)'.format(bins_age[i-1], bins_age[i]) for i in range(1, len(bins_age))]
indeks_sumins = ['[0-1)'.format(bins_sumins[i-1], bins_sumins[i]) for i in range(1, len(bins_sumins))]
indeks = MultiIndex.from_product([indeks_age, indeks_sex, indeks_sumins], names=['Age', 'Sex', 'Sumins'])

cols = ['A', 'B', 'C', 'D']

df = DataFrame(data = 0, index = indeks, columns = cols)

到目前为止一切都很好。我可以为一整套值赋值

>>> df['A']['[21-23)']['M'] = 1
>>> df
                           A  B  C  D
Age     Sex Sumins                   
[21-23) M   [0-10000)      1  0  0  0
            [10000-20000)  1  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[23-25) M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[25-27) M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[27-29) M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0

但是,只设置一个位置的值是不行的...

>>> df['B']['[21-23)']['M']['[10000-20000)'] = 2
>>> df
                           A  B  C  D
Age     Sex Sumins                   
[21-23) M   [0-10000)      1  0  0  0
            [10000-20000)  1  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[23-25) M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[25-27) M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[27-29) M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[16 rows x 4 columns]

这里发生了什么?我对我完全误解了多索引如何工作的想法持开放态度。有人吗?

【问题讨论】:

你正在做一个链式作业。你应该使用 loc。查看索引文档。 pandas.pydata.org/pandas-docs/stable/indexing.html 谢谢。我浏览了您链接到的文档,它肯定对这个问题有所了解。 【参考方案1】:

首先,看看chained indexing上的文档

其次,阅读这篇关于needing to sort MultiIndices的文章。

这会让你得到这个解决方案:

In [46]: df = df.sort_index()

In [47]: df.loc['[21-23)', 'M', '[10000-20000)'] = 2

In [48]: df
Out[48]: 
                           A  B  C  D
Age     Sex Sumins                   
[21-23) F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        M   [0-10000)      0  0  0  0
            [10000-20000)  2  2  2  2
[23-25) F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[25-27) F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
[27-29) F   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0
        M   [0-10000)      0  0  0  0
            [10000-20000)  0  0  0  0

[16 rows x 4 columns]

熊猫.14会有一些additional ways for slicing a MultiIndex。

【讨论】:

感谢您的快速回复。我做了更多调查,阅读了您建议的链接。为了只设置一个元素的值(即针对特定行中的特定列),首先从数据框(df['A'])中挑选出相关系列,然后在该系列上使用 loc -> df['A'].loc['[21-23)', 'M', '[10000-20000)']. 感谢@mortysporty 的评论!!!您应该回答自己的问题来解释这一点。

以上是关于设置值多索引 Pandas的主要内容,如果未能解决你的问题,请参考以下文章

使用多索引在 pandas DataFrame 上设置值

过滤多索引数据集(python/pandas)

Pandas 在行上设置多索引,然后转置到列

Pandas 从多索引级别获取所有值

Python,pandas:如何从对称的多索引数据框中提取值

Python Pandas 按多索引和列排序