在pandas Series中使用元组作为索引

6

我有一个非常简单的任务。基本上,我想创建一个pandas系列,并使用元组值作为索引。例如:

series_tmp = pd.Series()
series_tmp[(0,'a')] = 1

我想要做的是,在pd.Series中创建另一行,其索引为(0,'a'),值为1。
上述代码会出现错误:
KeyError: '[0 1] not in index'

需要帮助吗?

我了解多级索引,但它不能帮助我的情况。因为我需要有非常复杂的元组作为键,例如('a',(2,'c'),'d')。

结论: 感谢所有精彩的回答!要添加一个以元组为索引的行,我们应该这样做:

series_tmp = series_tmp.append(pd.Series([1],index=[(0,'a')]))
4个回答

3

如果您正在使用数据创建一个带有多级索引的系列对象,可以通过构建一个元组作为键的字典,并将数据作为值传递给系列构造函数来实现。然后将其传递给系列构造函数。

import pandas as pd

d = {(0,'a'):1, (0,'b'):1.5, (1,'a'):3, (1,'b'):3.5}
s = pd.Series(d)
s
# returns:
0  a    1.0
   b    1.5
1  a    3.0
   b    3.5
dtype: float64

基于评论的编辑:

针对这种情况,需要一个明确元组的索引。在这种情况下,您可以提前构建索引,然后将其作为构建系列时的index参数使用。

ix = pd.Index([(1,'a'), ('a',(2,'b')), (2,('b',1))])
s = pd.Series(data=[1,5,9], index=ix)
s
# returns:
(1, a)         1
(a, (2, b))    5
(2, (b, 1))    9
dtype: int64

# check indexing into the series object
s[('a',(2,'b'))]
# returns:
5

我知道多索引,但在我的应用程序中,我需要在单元格内使用实际的元组... 因为我将有非常复杂的元组作为键,例如 ('a', (2, 'b'))。 - user40780
所以你需要一个带有明确元组的索引? - James
谢谢!在这种情况下,添加元素的最佳方式是使用append和一个新的pd.Series吗? - user40780

1
尝试像这样:

这样做:

df = pd.DataFrame(columns=['a', 'b'], index=pd.MultiIndex.from_tuples([('0', 'a'), ('1', 'b')]))

print(df)

输出:

       a    b
0 a  NaN  NaN
1 b  NaN  NaN

我知道关于多索引的内容,但在我的应用程序中,我需要在单元格内使用实际的元组... 因为我将使用非常复杂的元组,例如 ('a',(2,'b')) 作为键.... - user40780

1
In :series_tmp = pd.Series([5,6],index=[(0,'a'),(1,'b')])
    series_tmp
Out:(0, a)    5
    (1, b)    6
    dtype: int64

0

如果您添加了重复的值,那么该解决方案就存在问题,因为索引将不再起作用:

s = pd.Series()
s = s.append(pd.Series([1],index=[(0,'a')])).append(pd.Series([0],index=[(0,'a')]))
s[(0, 'a')]

这会引发一个 KeyError: 'key of type tuple not found and not a MultiIndex'

我会考虑使用 repr 来转换元组:

s = pd.Series()
s[repr((0, 'a'))] = 1
s[repr((0, 'a'))] = 0
s[repr((0, 'a'))]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接