최근에 나는 판다를 배우기 시작했습니다. 나는 정말로 해결책을 얻으려고 노력했지만 찾을 수 없었습니다. 여기에 문제가 있습니다.
데이터 프레임이 있습니다. 간단한 축구 데이터입니다. 각 팀에 대해 이전 2 경기에서 득점 한 골 수를 알고 싶습니다. 홈 팀이든 어웨이 팀이든 상관 없습니다. 따라서 각 팀에 대해 2 개의 다른 열에서 특정 수의 값을 합산해야합니다.
샘플 데이터 :
import pandas as pd
data = [['2018-02-03', 'manutd', 'chelsea', 3, 1], ['2018-02-08', 'arsenal', 'liverpool', 1, 1],
['2018-01-12', 'chelsea', 'westham', 2, 0], ['2018-01-12', 'liverpool', 'manutd', 0, 2],
['2018-03-15', 'arsenal', 'chelsea', 2, 2], ['2018-02-20', 'manutd', 'brighton', 0, 0],
['2018-04-01', 'westham', 'fulham', 1, 0], ['2018-03-15', 'manutd', 'westham', 2, 1]]
df = pd.DataFrame(data, columns = ['event_time', 'home_team', 'away_team', 'home_goals', 'away_goals'])
df['event_time'] = pd.to_datetime(df['event_time'])
df.sort_values(['event_time'],inplace=True, ascending=False)
print(df)
event_date home_team away_team home_goals away_goals
6 2018-04-01 westham fulham 1 0
4 2018-03-15 arsenal chelsea 2 2
7 2018-03-15 manutd westham 2 1
5 2018-02-20 manutd brighton 0 0
1 2018-02-08 arsenal liverpool 1 1
0 2018-02-03 manutd chelsea 3 1
2 2018-01-12 chelsea westham 2 0
3 2018-01-12 liverpool manutd 0 2
내가 이루고 싶은 것 :
event_time home_team away_team home_goals away_goals h_goals_previous_2 a_goals_previous_2
6 2018-04-01 westham fulham 1 0 1 NaN
4 2018-03-15 arsenal chelsea 2 2 1 3
7 2018-03-15 manutd westham 2 1 3 0
5 2018-02-20 manutd brighton 0 0 5 NaN
1 2018-02-08 arsenal liverpool 1 1 NaN 0
0 2018-02-03 manutd chelsea 3 1 2 2
2 2018-01-12 chelsea westham 2 0 NaN NaN
3 2018-01-12 liverpool manutd 0 2 NaN NaN
설명 :-2018-03-15 아스날은 첼시와 경기했습니다. 지난 2 경기에서 첼시는 어웨이 팀일 때 1 골, 홈 팀일 때 2 골로 총 3 골을 기록했습니다. -이전 경기에 대한 데이터가 없기 때문에 이전 골 중 일부는 Nan입니다.
팀별로 팀을 반복하여 수행하려고했고 각 팀에 대해 정렬 된 df 하위 집합을 만든 다음 값을 집계 할 수 있었지만 최상의 솔루션이 아니라고 생각하고 멋진 Pandas 표현식을 사용하여 수행 할 수 있습니다.
teams = pd.unique(df[['home_team', 'away_team']].values.ravel('K'))
for team in teams:
print(team)
team_df = df[(df['home_team']==team) | (df['away_team']==team)]
team_df.sort_values(['event_date'],inplace=True, ascending=False)
print(team_df)
루프와 if를 작성하지 않고 어떻게 할 수 있습니까?
방법 1 : pd.wide_to_long
:
#Create a df2 with index like a column a rename the columns to apply:
# pd.wide_to_long
df2=df.set_index('event_time',append=True)
df2.columns=[''.join(name[::-1]) for name in df2.columns.str.split('_')]
df2.columns=df2.columns.str.replace('home','1').str.replace('away','2')
df2=df2.reset_index()
#Using pd.wide_to_long
df_long=( pd.wide_to_long(df2,['team','goals'],i='level_0',j='key')
.sort_values('event_time',ascending=False) )
print(df_long)
event_time team goals
level_0 key
6 1 2018-04-01 westham 1
2 2018-04-01 fulham 0
4 1 2018-03-15 arsenal 2
7 1 2018-03-15 manutd 2
4 2 2018-03-15 chelsea 2
7 2 2018-03-15 westham 1
5 1 2018-02-20 manutd 0
2 2018-02-20 brighton 0
1 1 2018-02-08 arsenal 1
2 2018-02-08 liverpool 1
0 1 2018-02-03 manutd 3
2 2018-02-03 chelsea 1
2 1 2018-01-12 chelsea 2
3 1 2018-01-12 liverpool 0
2 2 2018-01-12 westham 0
3 2 2018-01-12 manutd 2
#calculating the sum
groups_goals=df_long.groupby('team')['goals']
df_long=df_long.assign(value_2_sum=groups_goals.shift(-1)+groups_goals.shift(-2))
#Getting goals previous columns
goals_previous=df_long.pivot_table(index='level_0',columns='key',values='value_2_sum',dropna=False)
df[['h_goals_previous_2', 'a_goals_previous_2']]=goals_previous
print(df)
방법 2 : DataFrame.melt
cols=['h_goals_previous_2', 'a_goals_previous_2']
df2=( df.reset_index()
.melt(['event_time','home_team','away_team','index'])
.sort_values('event_time',ascending=False) )
df2['team']=df2['home_team'].mask(df2['variable'].eq('away_goals'),df2['away_team'])
groups_goals=df2.groupby('team')['value']
df2['value_2']=groups_goals.shift(-2)+groups_goals.shift(-1)
df[cols]=( df2.pivot_table(columns='variable',index='index',values='value_2',dropna=False)
.sort_index(axis=1,ascending=False) )
print(df)
산출:
event_time home_team away_team home_goals away_goals \
6 2018-04-01 westham fulham 1 0
4 2018-03-15 arsenal chelsea 2 2
7 2018-03-15 manutd westham 2 1
5 2018-02-20 manutd brighton 0 0
1 2018-02-08 arsenal liverpool 1 1
0 2018-02-03 manutd chelsea 3 1
2 2018-01-12 chelsea westham 2 0
3 2018-01-12 liverpool manutd 0 2
h_goals_previous_2 a_goals_previous_2
6 1.0 NaN
4 NaN 3.0
7 3.0 NaN
5 5.0 NaN
1 NaN NaN
0 NaN NaN
2 NaN NaN
3 NaN NaN
데이터 프레임에 표시된 행만 사용했기 때문에 NaN 값이 더 많이 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다