【问题标题】:add rows to groups in pandas dataframe向熊猫数据框中的组添加行
【发布时间】:2014-08-29 18:28:04
【问题描述】:

我有一个熊猫数据框df。像这样创建:

a = np.array([0,0,0,1,1,1,2,2,2]).T

bcd = np.array([np.arange(1,10)]*3).T

df = pd.DataFrame(bcd, columns=["b","c","d"])

df["a"] = a

看起来像这样:

     b   c   d   a
0    1   1   1   0
1    2   2   2   0
2    3   3   3   0
3    4   4   4   1
4    5   5   5   1
5    6   6   6   1
6    7   7   7   2
7    8   8   8   2
8    9   9   9   2

我想在'a' 列的每个分组之后插入 3 行。具体来说,我想在 'b' 列中进行一些自动增量,并将 None 对象放在其他任何地方:类似于:

     b   c    d    a 
0    1   1    1    0
1    2   2    2    0
2    3   3    3    0
3    10  None None 0
4    11  None None 0
5    12  None None 0
6    4   4    4    1
7    5   5    5    1
8    6   6    6    1
9    10  None None 1
10   11  None None 1
11   12  None None 1
12   7   7    7    2
13   8   8    8    2
14   9   9    9    2
15   10  None None 2
16   11  None None 2
17   12  None None 2

【问题讨论】:

  • 您想要重复索引 3、4 和 5?
  • 大声笑不抱歉,错字。我亲笔写出来的。修好了。

标签: python pandas group-by dataframe


【解决方案1】:

您想要做的并不是真正的插入操作,因为DataFrame 后面的数据结构不允许简单的插入。所以,从本质上讲,你必须从旧的DataFrame 的碎片中构建一个新的DataFrame。

所以,你的代码应该:

  1. 创建一个新的DataFrame
  2. 查找拆分表的位置(使用列a)
  3. 将现有表中的切片附加到新的DataFrame
  4. 创建新的数据位
  5. 将新数据附加到新的DataFrame
  6. 根据需要多次重复步骤 2-5。

(或者你可以连接而不是追加,如果你觉得它更容易的话。)要考虑的一件事是你对索引做了什么。如果您不使用它们,您可以通过在concat 或append 上使用ignore_index=True 关键字参数来忽略它们(= 根据需要创建新的)。

更多信息:

http://pandas.pydata.org/pandas-docs/dev/merging.html

顺便说一句,您不一定希望在数据框中包含任何 Nones。如果您有数字数据,则希望使用NaN。否则可能会发生奇怪的事情(你最终会得到对象数组)。见:

http://pandas.pydata.org/pandas-docs/stable/missing_data.html

【讨论】:

    【解决方案2】:

    只需 concat 您要插入的插入(它们将附加在后面,或 df.append(the_insert),它做同样的事情)和 reset_index 结果以正确的顺序得到东西:

    In [137]:
    
    df2=pd.DataFrame({'b':[11,12,13], 'a':[0]*3})
    In [138]:
    
    df3=pd.concat((df, df2)).sort('a').reset_index(drop=True)
    #pd.concat((df, df2, df3, df4...., all the others...))
    In [139]:
    
    print df3
        a   b   c   d
    0   0   1   1   1
    1   0   2   2   2
    2   0   3   3   3
    3   0  11 NaN NaN
    4   0  12 NaN NaN
    5   0  13 NaN NaN
    6   1   4   4   4
    7   1   5   5   5
    8   1   6   6   6
    9   2   7   7   7
    10  2   8   8   8
    11  2   9   9   9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-11
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多