使用变量在pandas中添加列

时间:2017-09-20 18:12:17

标签: python python-3.x pandas dataframe

我试图理解这两个陈述之间的区别

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分配给其余行。为什么是这样?如何将第二种情况下的值分配给数据框中的所有行?

1 个答案:

答案 0 :(得分:2)

因为csv[0] 不是标量值。它是pd.Series,当您使用pd.Series进行作业时,它会尝试按索引对齐(pandas的整点),除了第一个,它可能会到达NAN row,因为只有第一行的索引与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