As I posted in my reply to the linked question, that is not how you should be referencing your data.
Per the docs:
str.format(*args, **kwargs) Perform a string formatting operation. The
string on which this method is called can contain literal text or
replacement fields delimited by braces {}. Each replacement field
contains either the numeric index of a positional argument, or the
name of a keyword argument. Returns a copy of the string where each
replacement field is replaced with the string value of the
corresponding argument.
>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'
It is best to be explicit in your code about the data.
>>> print("Here is {one} and {two}".format(one=c['a'], two=c['b']))
Here is 3 and 6
or...
col1 = 'a'
col2 = 'b'
>>> print("Here is {one} and {two}".format(one=c[col1], two=c[col2]))
Here is 3 and 6
even better...
col1 = 'a'
col2 = 'b'
n = 0 # Get the first row.
one, two = df.ix[n, [col1, col2]]
>>> print("Here is {one} and {two}".format(one=one, two=two))
Here is 3 and 6
Given that a Series supports __getattr__ under the hood, you can also access the results indirectly using dot notation or like a dictionary lookup.
row = df.loc[n]
>>> print("Here is {row.a} and {row.b}".format(row=row))
Here is 3 and 6
Although it is always safer to access data with brackets incase any column name clashes with an existing Series property or method.
df['sum'] = df.sum(axis=1)
# Safe method.
>>> print("{row[a]} and {row[b]} make {row[sum]}".format(row=row))
3 and 6 make 9
# Unsafe method.
print("{row.a} and {row.b} make {row.sum}".format(row=row))
3 and 6 make <bound method Series.sum of a 3
b 6
sum 9
Name: 0, dtype: int64>