使用variab在pandas中添加列

2024-06-17 09:53:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: csvinnonedataframeforreadifvalue
1条回答
网友
1楼 · 发布于 2024-06-17 09:53:30

因为csv[0]不是标量值。它是一个pd.Series,当你用pd.Series赋值时,它试图按索引对齐(pandas的整点),可能除了第一行之外它到处都是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

相关问题 更多 >