4

I would like speed my code, so I don't like to use double for: my code:

    for c in range(0, n-1):
        for l in range(0,n-c-1):
            df2.ix[l,c]=C_back(l,c,df)

I would like to use

for x in df.itertuples():

but I don't know how to modify a specific cell value. thanks

enden
  • 163
  • 3
  • 10

2 Answers2

2

use stack

for mytuple, value in df.stack().iteritems():
    print(mytuple, value)

consider the df

df = pd.DataFrame(np.arange(9).reshape(-1, 3), list('ABC'), list('XYZ'))
df

enter image description here

for mytuple, value in df.stack().iteritems():
    print(mytuple, value)

('A', 'X') 0
('A', 'Y') 1
('A', 'Z') 2
('B', 'X') 3
('B', 'Y') 4
('B', 'Z') 5
('C', 'X') 6
('C', 'Y') 7
('C', 'Z') 8

To set the values of df

for (i, j), value in df.stack().iteritems():
    df.set_value(i, j, value ** 2)

df

enter image description here

piRSquared
  • 285,575
  • 57
  • 475
  • 624
  • What if I want to set only the lower diagonal of my df, i.e (5,7,8) in the example, Thank you very much! – enden Nov 10 '16 at 22:41
  • more complicated, what if I want to replace the cell value (B,Z) by (B,Y).value *2 and (C,Y) by (C,X).value *2 and (C,Z) by (C,Y).value*2. – enden Nov 10 '16 at 22:52
  • 1
    set_value are not public api - yes they are not deprecated but discourage use – Jeff Nov 10 '16 at 23:06
2

Using iteruples:

        for each in dt.itertuples():
            dt.loc[each.Index, 'column'] = value
Jose
  • 145
  • 1
  • 3