Aquí hay un resumen de las soluciones válidas proporcionadas por todos los usuarios, para marcos de datos indexados por entero y cadena.
df.iloc, df.loc y df.at funcionan para ambos tipos de marcos de datos, df.iloc solo funciona con índices enteros de fila / columna, df.loc y df.at son compatibles para establecer valores usando nombres de columna y / o índices enteros .
Cuando el índice especificado no existe, tanto df.loc como df.at agregarían las filas / columnas recién insertadas al marco de datos existente, pero df.iloc generaría "IndexError: los indexadores posicionales están fuera de los límites". Un ejemplo de trabajo probado en Python 2.7 y 3.7 es el siguiente:
import numpy as np, pandas as pd
df1 = pd.DataFrame(index=np.arange(3), columns=['x','y','z'])
df1['x'] = ['A','B','C']
df1.at[2,'y'] = 400
# rows/columns specified does not exist, appends new rows/columns to existing data frame
df1.at['D','w'] = 9000
df1.loc['E','q'] = 499
# using df[<some_column_name>] == <condition> to retrieve target rows
df1.at[df1['x']=='B', 'y'] = 10000
df1.loc[df1['x']=='B', ['z','w']] = 10000
# using a list of index to setup values
df1.iloc[[1,2,4], 2] = 9999
df1.loc[[0,'D','E'],'w'] = 7500
df1.at[[0,2,"D"],'x'] = 10
df1.at[:, ['y', 'w']] = 8000
df1
>>> df1
x y z w q
0 10 8000 NaN 8000 NaN
1 B 8000 9999 8000 NaN
2 10 8000 9999 8000 NaN
D 10 8000 NaN 8000 NaN
E NaN 8000 9999 8000 499.0
df['x']['C']
), usedf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
mientras que muchas personas (incluido yo mismo) están más acostumbradas aldataframe[row][column]
orden. Como programador de Matlab and R, este último me parece más intuitivo, pero al parecer esa no es la forma en que trabaja Pandas ...