【问题标题】:Python: fill a row of a pandas dataframe with a column of an numpy arrayPython:用一列numpy数组填充pandas数据框的一行
【发布时间】:2020-03-24 08:29:10
【问题描述】:

我有一个 pandas 数据框(1413 行)和一个 numpy 数组(1412 行)。

type(df1)
Out[193]: pandas.core.frame.DataFrame

df1.shape
Out[194]: (1413, 15)

type(arr1)
Out[195]: numpy.ndarray

arr1.shape
Out[196]: (1412, 3)

我想用arr1 + nan中的一列填充df1中的一列,但它不起作用

df1['aaa'] = np.vstack((np.nan, arr1[:,0]))

谁能告诉我怎么做?

【问题讨论】:

  • 我不明白你想用np.nan 做什么。你希望它在哪里?
  • 您需要将缺失值添加到最后一个位置还是第一个位置?还有print (df.index)是什么?
  • @Johnny - 如果在他的问题下提问,没有必要。

标签: python pandas numpy dataframe


【解决方案1】:

您可以使用np.append

df1['aaa'] = np.append(np.nan, arr1[:,0])

【讨论】:

    【解决方案2】:

    你可以这样做,这里有结果。您添加列,第一行是 NaN:

    df['aaa'] = pd.Series(ar1[:,0])
    ea = np.empty(df.shape[1]).fill(np.nan)
    df.loc[-1] = ea
    df.index = df.index + 1
    df = df.reset_index(drop=True).sort_values(by=['aaa'], na_position='first')
    

    这是你的数据框:

    c1  c2  c3
    0   1   2   3
    1  10  20  30
    

    这是数组:

    [[  5  55]
     [ 50 550]]
    

    结果是这样的:

         c1    c2    c3   aaa
    2   NaN   NaN   NaN   NaN
    0   1.0   2.0   3.0   5.0
    1  10.0  20.0  30.0  50.0
    

    【讨论】:

    • “第一位置”不明确。你到底是什么意思?哪一行,哪一列?
    • @jezrael 是的,你是对的,但我认为教一个人钓鱼比给他鱼更好。
    【解决方案3】:

    虽然我可以看到其他几个答案,但他们都没有真正解决手头的问题。直觉上,你的方法没问题;您将nan 垂直堆叠在列数组上。

    df1['aaa'] = np.vstack((np.nan, arr1[:,0]))
    

    它应该工作,但它没有。这里的小问题是vstack 搜索列维度。 arr1[:,0] 的形状为(1412, );它没有第二个维度。简单地将其改造成 (1412,1) 即可使 vstack 正常工作。

    df1['aaa'] = np.vstack((np.nan, arr1[:,0].reshape(-1,1)))
    

    【讨论】:

      【解决方案4】:

      使用numpy.hstack 将一个值添加到1d 数组:

      df1 = pd.DataFrame({'a': range(6)})
      
      arr1 = np.arange(15).reshape(5,3)
      print (arr1)
      [[ 0  1  2]
       [ 3  4  5]
       [ 6  7  8]
       [ 9 10 11]
       [12 13 14]]
      
      df1['aaa'] = np.hstack((np.nan, arr1[:,0]))
      print (df1)
         a   aaa
      0  0   NaN
      1  1   0.0
      2  2   3.0
      3  3   6.0
      4  4   9.0
      5  5  12.0
      

      如果可能的话,另一个想法是 DataFrame 的非默认索引是使用带有索引 df1.index 的 Series 构造函数:

      df1 = pd.DataFrame({'a': range(6)}, index=list('abcdef'))
      
      arr1 = np.arange(15).reshape(5,3)
      print (arr1)
      [[ 0  1  2]
       [ 3  4  5]
       [ 6  7  8]
       [ 9 10 11]
       [12 13 14]]
      
      dif = df1.shape[0] - arr1.shape[0]
      df1['aaa'] = pd.Series(arr1[:,0], index=df1.index[dif:])
      print (df1)
         a   aaa
      a  0   NaN
      b  1   0.0
      c  2   3.0
      d  3   6.0
      e  4   9.0
      f  5  12.0
      

      最后位置:

      dif = df1.shape[0] - arr1.shape[0]
      df1['aaa'] = pd.Series(arr1[:,0], index=df1.index[:-dif])
      print (df1)
         a   aaa
      a  0   0.0
      b  1   3.0
      c  2   6.0
      d  3   9.0
      e  4  12.0
      f  5   NaN
      

      编辑:

      arr1 = np.arange(15).reshape(5,3)
      df1 = pd.DataFrame({'a': range(6)})
      

      如果通过0选择只能得到1d形状为(6,)的数组,所以numpy.hstack是必须的:

      a = np.hstack((np.nan, arr1[:,0]))
      print (a)
      [nan  0.  3.  6.  9. 12.]
      
      print (a.shape)
      (6,)
      
      df1['aaa'] = a
      

      如果通过[0] 选择得到2d 数组,其尺寸为MxN,形状为(6,1),因此可以使用numpy.vstack:

      a1 = np.vstack((np.nan, arr1[:,[0]]))
      print (a1)
      [[nan]
       [ 0.]
       [ 3.]
       [ 6.]
       [ 9.]
       [12.]]
      
      print (a1.shape)
      (6, 1)
      
      
      df1['aaa1'] = a1
      print (df1)
         a   aaa  aaa1
      0  0   NaN   NaN
      1  1   0.0   0.0
      2  2   3.0   3.0
      3  3   6.0   6.0
      4  4   9.0   9.0
      5  5  12.0  12.0   
      

      【讨论】:

      • 命令“hstack”有效!!但是为什么它是“hstack”而不是“vstack”呢?非常违反直觉。
      • @user2644687 - 我编辑答案并尝试解释它,请检查它。
      猜你喜欢
      • 2013-09-09
      • 2017-04-03
      • 2020-11-26
      • 2013-06-10
      • 1970-01-01
      • 2022-06-13
      • 2016-02-25
      • 2017-03-11
      • 2023-02-15
      相关资源
      最近更新 更多