#python #pandas
#python #pandas
Вопрос:
Поэтому я хочу добавить значение в существующее значение для определенного местоположения в pandas dataframe. И я попробовал это следующим образом:
import calendar
for index,row in data.iterrows():
print(index)
if row.mask:
date = calendar.monthrange(int(row.year), int(row.month))
date = pd.to_datetime(str(int(row.year)) '-' str(int(row.month)) '-' str(date[1]))
diff = data.real - data.fiction
df.loc[df.date==date, 'zeta'] =diff
Но в конце после этой операции значение такое же, как и предыдущее, и я не понимаю, почему, поскольку я использую loc, который указывает на определенную позицию И может изменять значения. Но мой не работает.
Образец данных:
Итак, здесь задействованы два фрейма данных. Одним из них является df, который выглядит как:
{'date': [datetime.date(2018, 7, 1),
datetime.date(2018, 7, 2),
datetime.date(2018, 7, 3),
datetime.date(2018, 7, 4),
datetime.date(2018, 7, 5),
datetime.date(2018, 7, 6),
datetime.date(2018, 7, 7),
datetime.date(2018, 7, 8),
datetime.date(2018, 7, 9),
datetime.date(2018, 7, 10)],
'alpha': [899.8399999999998,
804.2400000000001,
824.6400000000001,
903.7599999999999,
761.2900000000001,
766.7999999999998,
765.0699999999998,
882.8600000000001,
741.8199999999999,
729.6600000000001],
'beta': [660.24,
514.87,
456.6600000000001,
490.29,
469.83,
506.4,
571.65,
651.18,
545.5,
544.99],
'gamma': [1555.5299999999988,
1512.829999999999,
1507.4699999999991,
1491.1799999999994,
1019.4199999999994,
650.0699999999995,
674.7599999999999,
676.0899999999992,
464.05999999999966,
455.03000000000003],
'delta': [178.02,
150.75,
136.14999999999998,
147.51999999999998,
160.93000000000004,
131.96999999999997,
117.31,
131.88,
160.57000000000008,
158.73999999999998],
'epsilon': [0.0,
375.7099915,
464.85501100000005,
464.8450012,
484.63500980000003,
514.664978,
471.16000369999995,
459.8599853999999,
461.4349976,
441.9400024],
'zeta': [282.9800053,
156.5300011,
109.93999609999999,
83.86999995,
168.62735590000003,
170.31219380000002,
73.63714508,
119.776293,
179.14328830000002,
446.6358328],
'total': [3576.6100052999986,
3514.929992599999,
3499.7150070999996,
3581.4650011499994,
3064.7323656999997,
2740.2171717999995,
2673.5871487799996,
2921.646278399999,
2552.5282859,
2776.9958352000003]}
И данные, которые выглядят как:
{'month': [1, 2, 3, 4, 5, 6, 7, 8],
'year': [2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020],
'fiction': [4904.049999999999,
5098.29,
8582.139999999998,
13712.130000000001,
20505.370000000003,
3629.21,
0.0,
0.0],
'real': [14528.33,
12592.45,
8582.14,
13712.12,
20505.4,
19356.6,
18205.0,
13028.29],
'mask': [True, True, False, False, False, True, True, True]}
Маска вычисляется следующим образом:
(data.real - data.fiction).map(int).map(bool)
Комментарии:
1. что вы пытаетесь сделать со строкой
if row.mask:
?2. Ооо, это просто результат вычисления логического значения. Если вы хотите знать, это выглядит следующим образом:
(data.real - data.fiction).map(int).map(bool)
.3. вы предоставляете очень мало подробностей о многих объектах в своем коде … пожалуйста, поделитесь образцом фрейма данных с
df.head(10).to_dict('list')
и ожидаемым результатом из этого примера, все в виде блоков кода, чтобы мы могли скопировать в IDE и воспроизвести ваши результаты4. @RichieV Я добавил образец данных
Ответ №1:
У вас были две ошибки.
Во-первых, НИКОГДА не указывайте имена столбцов после встроенных функций.
mask является встроенной функцией и if row.mask
в любом случае вернет значение True. Потому что функция будет существовать независимо от того, хотите вы, чтобы она существовала или нет, поэтому практически нет необходимости проверять на основе этого. Я добавил оператор печати внутри оператора if. Просто чтобы убедиться, попробуйте добавить его в свой блок if, и вы поймете разницу. (Если вам НУЖНО назвать это именно так, хотя я не могу представить ситуацию, когда вам нужно выбрать имя встроенной функции, действуйте следующим образом: if row['mask']
и не проверяйте интеллект pandas.)
Во-вторых, .loc() присваивает значения. Но они должны соответствовать целевым измерениям.
Возможно, вы получаете какое-то сообщение об ошибке по этому поводу. Есть большая вероятность, что вы, возможно, захотите иметь разницу для этой конкретной строки (если нет, это ставит большой вопросительный знак при циклировании по всему dataframe), поэтому вы можете использовать row.real - row.fiction
вместо data.real - data.fiction
. Я внес эти два изменения, и фрейм данных изменился, как и ожидалось. Вот код с изменениями, которые вы, возможно, захотите подключить
import calendar
for index,row in data.iterrows():
if row.maskr:
print('Going for',index)
date = calendar.monthrange(int(row.year), int(row.month))
date = pd.to_datetime(str(int(row.year)) '-' str(int(row.month)) '-' str(date[1]))
diff = row.real - row.fiction
df.loc[df.date==date, 'zeta'] =diff