【问题标题】:Adding a column in pandas using a variable使用变量在熊猫中添加一列
【发布时间】:2017-09-20 18:12:17
【问题描述】:

我试图理解这两种说法的区别

dataframe['newColumn'] = 'stringconst'

for x in y:
   if x=="value":
      csv = pd.read_csv(StringIO(table), header=None, names=None)
      dataframe['newColumn'] = csv[0]

在第一种情况下,pandas 用常量值填充所有行,但在第二种情况下,它只填充第一行并将 NaN 分配给其余行。为什么是这样?如何将第二种情况下的值分配给数据框中的所有行?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    因为csv[0] 不是标量值。这是一个pd.Series,当您使用pd.Series 进行分配时,它会尝试按索引对齐(@9​​87654324@ 的整个点),并且可能除了第一行之外的所有地方都得到NAN,因为只有第一行的索引与pd.DataFrame 索引对齐。所以,考虑两个数据帧(注意,除了索引,它们是副本,它被移动了 20):

    >>> df
       0  1  2  3  4
    0  4 -5 -1  0  3
    1 -2 -2  1  3  4
    2  1  2  4  4 -4
    3 -5  2 -3 -5  1
    4 -5 -3  1  1 -1
    5 -4  0  4 -3 -4
    6 -2 -5 -3  1  0
    7  4  0  0 -4 -4
    8 -4  4 -2 -5  4
    9  1 -2  4  3  0
    >>> df2
        0  1  2  3  4
    20  4 -5 -1  0  3
    21 -2 -2  1  3  4
    22  1  2  4  4 -4
    23 -5  2 -3 -5  1
    24 -5 -3  1  1 -1
    25 -4  0  4 -3 -4
    26 -2 -5 -3  1  0
    27  4  0  0 -4 -4
    28 -4  4 -2 -5  4
    29  1 -2  4  3  0
    >>> df['new'] = df[1]
    >>> df
       0  1  2  3  4  new
    0  4 -5 -1  0  3   -5
    1 -2 -2  1  3  4   -2
    2  1  2  4  4 -4    2
    3 -5  2 -3 -5  1    2
    4 -5 -3  1  1 -1   -3
    5 -4  0  4 -3 -4    0
    6 -2 -5 -3  1  0   -5
    7  4  0  0 -4 -4    0
    8 -4  4 -2 -5  4    4
    9  1 -2  4  3  0   -2
    >>> df['new2'] = df2[1]
    >>> df
       0  1  2  3  4  new  new2
    0  4 -5 -1  0  3   -5   NaN
    1 -2 -2  1  3  4   -2   NaN
    2  1  2  4  4 -4    2   NaN
    3 -5  2 -3 -5  1    2   NaN
    4 -5 -3  1  1 -1   -3   NaN
    5 -4  0  4 -3 -4    0   NaN
    6 -2 -5 -3  1  0   -5   NaN
    7  4  0  0 -4 -4    0   NaN
    8 -4  4 -2 -5  4    4   NaN
    9  1 -2  4  3  0   -2   NaN
    

    因此,分配整列可以做的一件事就是简单地分配

    >>> df
       0  1  2  3  4  new  new2
    0  4 -5 -1  0  3   -5   NaN
    1 -2 -2  1  3  4   -2   NaN
    2  1  2  4  4 -4    2   NaN
    3 -5  2 -3 -5  1    2   NaN
    4 -5 -3  1  1 -1   -3   NaN
    5 -4  0  4 -3 -4    0   NaN
    6 -2 -5 -3  1  0   -5   NaN
    7  4  0  0 -4 -4    0   NaN
    8 -4  4 -2 -5  4    4   NaN
    9  1 -2  4  3  0   -2   NaN
    >>> df['new2'] = df2[1].values
    >>> df
       0  1  2  3  4  new  new2
    0  4 -5 -1  0  3   -5    -5
    1 -2 -2  1  3  4   -2    -2
    2  1  2  4  4 -4    2     2
    3 -5  2 -3 -5  1    2     2
    4 -5 -3  1  1 -1   -3    -3
    5 -4  0  4 -3 -4    0     0
    6 -2 -5 -3  1  0   -5    -5
    7  4  0  0 -4 -4    0     0
    8 -4  4 -2 -5  4    4     4
    9  1 -2  4  3  0   -2    -2
    

    或者,如果您想分配第一列中的第一个值,那么实际选择第一个值使用iloc或其他选择器,然后然后 做作业:

    >>> df
       0  1  2  3  4  new  new2
    0  4 -5 -1  0  3   -5    -5
    1 -2 -2  1  3  4   -2    -2
    2  1  2  4  4 -4    2     2
    3 -5  2 -3 -5  1    2     2
    4 -5 -3  1  1 -1   -3    -3
    5 -4  0  4 -3 -4    0     0
    6 -2 -5 -3  1  0   -5    -5
    7  4  0  0 -4 -4    0     0
    8 -4  4 -2 -5  4    4     4
    9  1 -2  4  3  0   -2    -2
    >>> df['newest'] = df2.iloc[0,0]
    >>> df
       0  1  2  3  4  new  new2  newest
    0  4 -5 -1  0  3   -5    -5       4
    1 -2 -2  1  3  4   -2    -2       4
    2  1  2  4  4 -4    2     2       4
    3 -5  2 -3 -5  1    2     2       4
    4 -5 -3  1  1 -1   -3    -3       4
    5 -4  0  4 -3 -4    0     0       4
    6 -2 -5 -3  1  0   -5    -5       4
    7  4  0  0 -4 -4    0     0       4
    8 -4  4 -2 -5  4    4     4       4
    9  1 -2  4  3  0   -2    -2       4
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2022-01-26
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      相关资源
      最近更新 更多