【问题标题】:Python Pandas hierarchical (tuple) row indexing -- how to select all of an intermediate row?Python Pandas 分层(元组)行索引——如何选择所有中间行?
【发布时间】:2017-04-30 17:10:13
【问题描述】:

考虑以下代码:

row1 = [(2,2), (4,4)]
row2 = [(5,5)]
row3 = [10, 20, 30, 40]
row_tuple_list = []
for r1 in row1:
    for r2 in row2:
        for r3 in row3:
            row_tuple_list.append((r1, r2, r3))

row_index = pd.MultiIndex.from_tuples(row_tuple_list, names=['row1', 'row2', 'row3'])

col1 = ['f', 'i']
col2 = ['g', 'h']
col_tuple_list = []
for c1 in col1:
    for c2 in col2:
        col_tuple_list.append((c1, c2))

col_index = pd.MultiIndex.from_tuples(col_tuple_list, names=['col1', 'col2'])

df = pd.DataFrame(index=row_index, columns=col_index)

生成数据框:

col1                  f         i     
col2                  g    h    g    h
row1   row2   row3                    
(2, 2) (5, 5) 10    NaN  NaN  NaN  NaN
              20    NaN  NaN  NaN  NaN
              30    NaN  NaN  NaN  NaN
              40    NaN  NaN  NaN  NaN
(4, 4) (5, 5) 10    NaN  NaN  NaN  NaN
              20    NaN  NaN  NaN  NaN
              30    NaN  NaN  NaN  NaN
              40    NaN  NaN  NaN  NaN

现在,我想设置此数据框的各个元素。例如,

w=(2,2)
x=(5,5)
y=10

df.loc[(w,x,y),('f','g')] = 200 

print(df)

给出:

col1                  f         i     
col2                  g    h    g    h
row1   row2   row3                    
(2, 2) (5, 5) 10    200  NaN  NaN  NaN
              20    NaN  NaN  NaN  NaN
              30    NaN  NaN  NaN  NaN
              40    NaN  NaN  NaN  NaN
(4, 4) (5, 5) 10    NaN  NaN  NaN  NaN
              20    NaN  NaN  NaN  NaN
              30    NaN  NaN  NaN  NaN
              40    NaN  NaN  NaN  NaN

有没有办法在不显式设置第二行值的情况下执行此操作(因为我知道 row1 和 row2 以相同的频率出现)?

我试过了:

df.loc[(w,slice(None),y),('f','g')] =100

失败了。

【问题讨论】:

    标签: python pandas dataframe indexing hierarchical


    【解决方案1】:
    # you need to use slice for w as well. This should work.
    df.loc[(slice(w),slice(None),y),('f','g')]
    
    df
    Out[208]: 
    col1                  f         i     
    col2                  g    h    g    h
    row1   row2   row3                    
    (2, 2) (5, 5) 10    100  NaN  NaN  NaN
                  20    NaN  NaN  NaN  NaN
                  30    NaN  NaN  NaN  NaN
                  40    NaN  NaN  NaN  NaN
    (4, 4) (5, 5) 10    NaN  NaN  NaN  NaN
                  20    NaN  NaN  NaN  NaN
                  30    NaN  NaN  NaN  NaN
    

    【讨论】:

    • 太好了!看来我不明白 slice 在这里做什么。你能解释一下为什么我也需要使用 slice(w) 吗?
    • 另外,如果您对此one 有任何想法,我们将不胜感激!
    • df.loc[(w,slice(None),y),('f','g')] 应该可以工作,但它不适用于您的数据框。我认为这与您的索引“(2,2)”周围的括号有关。它可能以某种方式弄乱了熊猫索引。这也应该在不向 w 添加切片的情况下工作。 df.loc[([w],slice(None),y),('f','g')]
    • 快速跟进问题:您能否告诉我在设置其值后如何访问相同的数量? df.loc[([w],slice(None),y),('f','g')] 给我: row1 row2 row3 (2, 2) (5, 5) 10 100 名称:(f, g), dtype: object 而不仅仅是 100。
    猜你喜欢
    • 2019-06-18
    • 2012-08-10
    • 2016-12-17
    • 2017-11-20
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多