【问题标题】:Filling an empty dataframe by assignment via loc selection with tuple indices通过使用元组索引的 loc 选择分配来填充空数据帧
【发布时间】:2018-05-10 16:36:17
【问题描述】:

为什么会这样?

a=pd.DataFrame()
a.loc[1,2]=0

>
     2
1  0.0

而且,这不起作用?

a=pd.DataFrame()
a.loc[(1,2),2]=0
>
KeyError: '[1 2] not in index'

后者是我想做的。我将通过使用元组指定索引的 loc 选择从没有值、0 行、0 列的数据帧中填充值。

【问题讨论】:

    标签: python pandas dataframe assign


    【解决方案1】:

    如果您的数据框已经具有多索引,则使用元组作为索引将起作用:

    import pandas as pd
    
    # Define multi-index
    index = pd.MultiIndex.from_product([[],[]], names=['first', 'second'])
    # or
    # index = pd.MultiIndex.from_tuples([], names=['first', 'second']) 
    
    a = pd.DataFrame(index=index)
    a.loc[(1,2), 2]=0
    
    #                 2
    # first second     
    # 1.0   2.0     0.0
    

    【讨论】:

    • 这不是一个很好的例子,因为数据框一开始并不是完全空的......更好的比较将使用空的 MultiIndex。
    • 是的,我想要一个空的多索引。但是 pd.MultiIndex.from_tuples([], names=['first', 'second']) 给了我 TypeError: Cannot infer the number of levels from empty list。
    • @ConanG 它对我有用(在 Pandas 0.20.3 中)。你有其他版本的 Pandas 吗?
    • pd.MultiIndex.from_product([[],[]], names=['first', 'second']) 工作
    • 我的版本是'0.19.2'。但我将无法更新它。
    【解决方案2】:

    我喜欢Julien's Answer,因为它不像魔法。所有这些都是为了设置一个 2 级多索引。

    set_index 带有空数组

    i = np.array([])
    a = pd.DataFrame().set_index([i, i])
    a.loc[(1, 2), 2] = 0
    
    a
    
               2
    1.0 2.0  0.0
    

    稍微简洁一点

    a = pd.DataFrame().set_index([np.array([])] * 2)
    a.loc[(1, 2), 2] = 0
    

    pd.concat

    a = pd.concat([pd.DataFrame()] * 2, keys=[1, 2])
    a.loc[(1, 2), 2] = 0
    
    a
    
           2
    1 2  0.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多