Вот фрейм данных
MatchId EventCodeId EventCode Team1 Team2 Team1_Goals Team2_Goals xG_Team1 xG_Team2 CurrentPlaytime
0 865314 1029 Goal Home Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 457040
1 865314 1029 Goal Home Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 1405394
2 865314 2053 Goal Away Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 1898705
3 865314 2053 Goal Away Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 4388278
4 865314 1029 Goal Home Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 4507898
5 865314 1030 Cancel Goal Home Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 4517728
6 865314 1029 Goal Home Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 4956346
7 865314 1030 Cancel Goal Home Northampton Crawley Town 2 2 2.067663207769023 0.8130662505484256 4960633
8 865316 2053 Goal Away Coventry Bradford 0 0 1.0847662440468118 1.2526705617472387 447858
9 865316 2054 Cancel Goal Away Coventry Bradford 0 0 1.0847662440468118 1.2526705617472387 456361
Новые столбцы будут созданы следующим образом:
for EventCodeId = 1029 and EventCode = Goal Home
new_col1 = CurrentPlaytime/3*10**4
for EventCodeId = 2053 and ventCode = Goal Away
new_col2 = CurrentPlaytime/3*10**4
Для всех остальных EventCodeId и EventCodenew_co1 и new_col2 возьмут 0..
Вот как я начал, но не смог пойти дальше. пожалуйста помоги
new_col1 = []
new_col2 = []
def timeslot(EventCodeId, EventCode, CurrentPlaytime):
if x == 1029 and y == 'Goal Home':
new.Col1.append(z/(3*10**4))
elif x == 2053 and y == 'Goal Away':
new_col2.append(z/(3*10**4))
else:
new_col1.append(0)
new_col2.append(0)
return new_col1
return new_col2
df1['new_col1', 'new_col2'] = df1.apply(lambda x,y,z: timeslot(x['EventCodeId'], y['EventCode'], z['CurrentPlaytime']), axis=1)
TypeError: ("<lambda>() missing 2 required positional arguments: 'y' and 'z'", 'occurred at index 0')






Вам не нужен явный цикл. По возможности используйте векторизованные операции.
Использование numpy.where:
s = df1['CurrentPlaytime']/3*10**4
mask1 = (df1['EventCodeId'] == 1029) & (df1['EventCode'] == 'Goal')
mask2 = (df1['EventCodeId'] == 2053) & (df1['EventCode'] == 'Away')
df1['new_col1'] = np.where(mask1, s, 0)
df1['new_col2'] = np.where(mask2, s, 0)
@jpp Спасибо, что нашли время взглянуть на мою проблему. ваше решение выглядит таким простым и элегантным, но я получаю следующую ошибку. TypeError: неподдерживаемые типы операндов для /: 'str' и 'int'
@ A.Abs, преобразовать соответствующие серии в числовые, например df1['EventCodeId'] = pd.to_numeric(df1['EventCodeId'], errors='coerce')
@jpp, для каждого матча на основе MatchId или xG_Team1 vs xG_Team2 (строка подключена), как я могу создать список Home_Goal из new_col1 и Away_Goal из new_col2?
@ A.Abs, я предлагаю вам спросить как отдельный вопрос.
Просто поставьте здесь ссылку на вопрос, и я посмотрю.
@jpp, вот мой новый пост. Создайте список из столбца в фрейме данных pandas, который будет использоваться в функции.
Хорошее решение :)