Как заполнить строки DataFrame значениями из цикла?
Каким образом вообще в принципе можно при анализе DataFrame в цикле, записывать в пустые ячейки столбца значения? Например, скажем:
df['now_I_can_write_total']
import pandas as pd
import numpy as np
df = pd.read_csv('... .csv')
value_l = list(df['value'].values)
for i in range(len(df)):
total = 1000
if value_l[i] > 100:
df['now_I_can_write_total'] = total
print(total)
Собственно:
df['now_I_can_write_total'] = total
определенно как не правильная запись.
Ответы (2 шт):
Без примеров данных трудно понять, что вы хотите сделать, но предположу, что вы хотите заполнить значения нового столбца следующим образом:
- если значение в столбце
value > 100то заполняем столбецnow_I_can_write_totalзначениемtotal - в противном случае заполняем
NaN
Сделать это можно так (векторизированным способом, т.е. без циклов):
df.loc[df['value'] > 100, 'now_I_can_write_total'] = total
Если нужно только вычислить значение на основе значения в другом столбце этой же строки, то можно с помощью numpy.where():
In [85]: import pandas as pd
In [86]: import numpy as np
In [87]: df
Out[87]:
idx value
0 1 50
1 2 150
2 3 120
3 4 40
4 5 200
In [88]: df['now_I_can_write_total'] = np.where(df.value > 100, 1000, pd.NA)
In [89]: df
Out[89]:
idx value now_I_can_write_total
0 1 50 <NA>
1 2 150 1000
2 3 120 1000
3 4 40 <NA>
4 5 200 1000
Или, если нужны какие-то дополнительные манипуляции, применить свою функцию с помощью apply():
In [103]: def calc_total(row):
...: total = 1000
...: if row.value > 100:
...: return total
...: return pd.NA
...:
In [104]: df
Out[104]:
idx value
0 1 50
1 2 150
2 3 120
3 4 40
4 5 200
In [105]: df['now_I_can_write_total'] = df.apply(calc_total, axis=1)
In [106]: df
Out[106]:
idx value now_I_can_write_total
0 1 50 <NA>
1 2 150 1000
2 3 120 1000
3 4 40 <NA>
4 5 200 1000
Если рассматривать ваш цикл, то для записи значения вам еще нужно указать индекс:
df.loc[i, 'now_I_can_write_total'] = total
In [116]: df
Out[116]:
idx value
0 1 50
1 2 150
2 3 120
3 4 40
4 5 200
In [117]: value_l = list(df['value'].values)
In [118]: value_l
Out[118]: [50, 150, 120, 40, 200]
In [119]: for i in range(len(df)):
...: total = 1000
...: if value_l[i] > 100:
...: df.loc[i, 'now_I_can_write_total'] = total
...:
In [120]: df
Out[120]:
idx value now_I_can_write_total
0 1 50 NaN
1 2 150 1000.0
2 3 120 1000.0
3 4 40 NaN
4 5 200 1000.0