2017-09-20 42 views
0

我試圖理解這兩個語句使用可變

dataframe['newColumn'] = 'stringconst' 

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

在第一種情況下,大熊貓之間的區別添加在大熊貓列填充所有常數值的行,但在第二種情況下,它僅填充第一行並將NaN分配給其餘行。爲什麼是這樣?如何將第二種情況下的值分配給數據框中的所有行?

回答

2

因爲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或其他selecto的第一個值 r and then do assignment:

>>> 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