This is probably by design but I find this very unintuitive...
More context:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.zeros(2), columns=['A'])
data.loc[:].A = 'HELLO'
print data
data = pd.DataFrame(np.zeros(2), columns=['A'])
data.A.loc[:] = 'HELLO'
print data
data = pd.DataFrame(np.zeros(2), columns=['A'])
data.loc[:1].A = 'HELLO' # <-- FAILS
print data
data = pd.DataFrame(np.zeros(2), columns=['A'])
data.A.loc[:1] = 'HELLO'
print data
Output:
A
0 HELLO
1 HELLO
A
0 HELLO
1 HELLO
A
0 0
1 0
A
0 HELLO
1 HELLO
This is all chained assignment, you never want to do this: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
simply do
df.loc[row_indexer,col_indexer] = value
and it will always work