Не просто, но возможно с выбором по предыдущим значениям на loc
, для выбора только числовые столбцы используйте DataFrame.select_dtypes
:
def calc_by_previous_answer(row):
#here i have only the current row so I'm unable to get the previous one
#cannot select previous row of first row because not exist
if row.name > 0:
row = df.loc[row.name-1, c] * 0.5 + row
# else:
# row = row * 0.5
return row
c = df.select_dtypes(np.number).columns
df[c] = df[c].apply(calc_by_previous_answer, axis=1)
print (df)
A B C String_column
0 0.297925 -1.025012 1.307090 'a'
1 -1.378443 0.020945 0.003293 'b'
2 -2.410128 1.004794 0.237621 'c'
3 -0.869085 0.457898 1.214023 'd'
4 -0.987162 0.587249 1.340056 'e'
Решение без apply
с DataFrame.add
:
c = df.select_dtypes(np.number).columns
df[c] = df[c].add(df[c].shift() * 0.5, fill_value=0)
print (df)
A B C String_column
0 0.297925 -1.025012 1.307090 'a'
1 -1.378443 0.020945 0.003293 'b'
2 -2.410128 1.004794 0.237621 'c'
3 -0.869085 0.457898 1.214023 'd'
4 -0.987162 0.587249 1.340056 'e'
EDIT:
c = df.select_dtypes(np.number).columns
for idx, row in df.iterrows():
if row.name > 0:
df.loc[idx, c] = df.loc[idx-1, c] * 0.5 + df.loc[idx, c]
print (df)
A B C String_column
0 0.297925 -1.025012 1.307090 'a'
1 -1.378443 0.020945 0.003293 'b'
2 -2.335647 0.748541 0.564393 'c'
3 -1.213695 0.463134 1.214847 'd'
4 -1.571074 0.774384 1.481154 'e'