【问题标题】:How do I set tuple value to pandas dataframe?如何将元组值设置为熊猫数据框?
【发布时间】:2018-04-09 16:23:24
【问题描述】:

我想做的应该很简单。本质上,我有一些数据框,我需要为某些列分配一些元组值。

例如:

pd_tmp = pd.DataFrame(np.random.rand(3,3))
pd_tmp["new_column"] = ("a",2)

我只需要一个带有元组值的新列,我该怎么办?

ValueError: Length of values does not match length of index

前面的代码出错了。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将元组包装在一个列表中:

    import pandas as pd
    pd_tmp = pd.DataFrame(np.random.rand(3,3))
    pd_tmp["new_column"] = [("a",2)] * len(pd_tmp)
    
    pd_tmp
    #          0           1           2    new_column
    #0  0.835350    0.338516    0.914184    (a, 2)
    #1  0.007327    0.418952    0.741958    (a, 2)
    #2  0.758607    0.464525    0.400847    (a, 2)
    

    【讨论】:

      【解决方案2】:

      series的文档。

      Series 是一个可以保存任何数据的一维标签数组 类型(整数、字符串、浮点数、Python 对象、 等等。)。轴标签统称为索引。这 创建系列的基本方法是调用:

      >>> s = pd.Series(data, index=index)
      

      在这里,数据可以是很多不同的东西:

      • Python 字典
      • 一个ndarray
      • 标量值(如 5)

      所以Series 不会直接采用元组类型。
      @Psidom 的答案是将元组作为ndarray 的元素。

      如果您询问如何set a cell of Series/Dataframe,这是一个问问题。

      【讨论】:

        【解决方案3】:

        您可以将apply 与返回tuplelambda 一起使用

        pd_tmp.assign(newc_olumn=pd_tmp.apply(lambda x: ('a', 2), 1))
        
                  0         1         2 newc_olumn
        0  0.373564  0.806956  0.106911     (a, 2)
        1  0.332508  0.711735  0.230347     (a, 2)
        2  0.516232  0.343266  0.813759     (a, 2)
        

        【讨论】:

          【解决方案4】:

          我一直在寻找类似的东西,但就我而言,我希望元组是现有列的组合,而不仅仅是一个固定值。我找到了下面的解决方案,我分享它希望它对像我这样的其他人有用。

          In [24]: df
          Out[24]:
                A     B
          0     1     2
          1    11    22
          2   111   222
          3  1111  2222
          
          In [25]: df['D'] = df[['A','B']].apply(tuple, axis=1)
          
          In [26]: df
          Out[26]:
                A     B             D
          0     1     2        (1, 2)
          1    11    22      (11, 22)
          2   111   222    (111, 222)
          3  1111  2222  (1111, 2222)
          

          【讨论】:

            【解决方案5】:

            如前所述,诀窍是在列表 [('a', 2)] 中为每个值放置一个元组
            并乘以行数或使用 apply/lambda
            以下是一些额外的相关案例:

            如果元组中只有一位数字,则添加逗号:

            pd.DataFrame({'no_comma': [(1.9)], 'with_comma': [(1.9,)]})
            

            将元组放入索引:

            size = 3  
            pd.DataFrame(np.random.rand(3,size), [('a',2)]*size )
            

            【讨论】:

              猜你喜欢
              • 2016-04-20
              • 1970-01-01
              • 2016-05-26
              • 1970-01-01
              • 2021-05-10
              • 1970-01-01
              • 2015-02-02
              • 2020-06-05
              • 2019-04-23
              相关资源
              最近更新 更多