[英]Pandas reshaping date frame, groupby bins
在重塑熊貓數據框時,我需要您的幫助。 我對熊貓還很陌生(雖然已經戀愛了),但是這個問題一直困擾着我。
我正在進行一項環境研究,其中涉及對特定路線上的汽車進行計數,並記下它們的來源,目的地和乘客數量。
數據框看起來像這樣(實際上它包含10,000行)
df = pd.DataFrame(
{'date':['20151201','20151202','20151203','20151204','20151204','20151205','20151206','20151207','20151210','20151211','20151212','20151225'],
'id':[123,234,543,890,543,123,234,543,123,123,123,890],
'event':[1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1],
'city':['AB','YU','CD','CD','YU','YU','BA','AB','CB','BA','CY','CC'],
'number of passengers':[1,5,1,20,1,1,5,10,2,25,3,20]
}
)
city date event id number of passengers
0 AB 20151201 1 123 1
1 YU 20151202 1 234 5
2 CD 20151203 1 543 1
3 CD 20151204 1 890 20
4 YU 20151204 -1 543 1
5 YU 20151205 -1 123 1
6 BA 20151206 -1 234 5
7 AB 20151207 -1 543 10
8 CB 20151210 -1 123 2
9 BA 20151211 -1 123 25
10 CY 20151212 -1 123 3
11 CC 20151225 -1 890 20
其中df ['event']指示城市是汽車的原點(1)還是目的地(-1)。 df ['id']是汽車的唯一標識符(牌照)。
為了使事情變得更加復雜(至少對我而言),可能有多次觀察返回同一條路線,同一天或另一天的汽車,並且觀察結果當然是不完整的(例如,汽車未發回原地)。
df.set_index(['id','date','event']).unstack('event').swaplevel(0,1,axis=1)
event -1 1 -1 1
city city number of passengers number of passengers
id date
123 20151201 NaN AB NaN 1
20151205 YU NaN 1 NaN
20151210 CB NaN 2 NaN
20151211 BA NaN 25 NaN
20151212 CY NaN 3 NaN
234 20151202 NaN YU NaN 5
20151206 BA NaN 5 NaN
543 20151203 NaN CD NaN 1
20151204 YU NaN 1 NaN
20151207 AB NaN 10 NaN
890 20151204 NaN CD NaN 20
20151225 CC NaN 20 NaN
我想到的目標是創建一個數據框,以顯示所有來自城市的交通,其目的地以及對乘客數量的觀察(理想情況下分為'(1-2),(3-5 ),(6-7),(> 7))
理想情況下,我希望生成的數據框看起來像這樣:
Origin Destination 0-2 3-5 6-7 >7
AB YU 1 0 0 0
CB 1 0 0 0
BA 0 0 0 1
CY 0 1 0 0
YU BA 0 2 0 0
CD YU 1 2 0 0
AB 0 0 1 0
CC 0 0 0 1
我通過添加了起點和終點列
df['origin']= np.where(df['event'] == 1,df['city'],np.NAN)
df['destination']= np.where(df['event'] == -1,df['city'],np.NAN)
但是重塑的后續步驟讓我望而卻步。 我已經嘗試了一些大熊貓樞軸和大熊貓堆疊的方法,但是似乎我錯過了一些東西,因為它們都不起作用。 我想我也需要在某一點上使用熊貓切塊進行分箱,但是我在分析中未能達到這一階段。
您能為我指明正確的方向嗎? 我將如何重塑數據以實現按來源顯示的流量視圖?
您有最誠摯的歉意,因為這很難遵循,因此,如果有人可以想到一種更簡單的方法,那就去做吧,但是在這里您可以:
df['number of passengers'] = pd.cut(df['number of passengers'],
bins=[0, 2, 5, 7, max(df['number of passengers']) + 1],
right=False)
# Recode the factor levels for readable column labels when unstacked
df.ix[df['event']==1, 'event'] = 'origin'
df.ix[df['event']==-1, 'event'] = 'destination'
# Split the DataFrame, unstack each factor, then join
new_df = pd.DataFrame(
df.groupby('id')['number of passengers'].value_counts()
).unstack(
'number of passengers'
).fillna(0).join(
df.set_index('id')[['city', 'date', 'event']].reset_index().set_index(
['id', 'date', 'event']
).unstack('event').reset_index(level='date', drop=True)
).reset_index()
# Flatten the column multiindex
new_df.columns = new_df.columns.droplevel()
new_df.columns = ['id', '[0, 2)', '[2, 5)', '[5, 7)', '> 7', 'destination', 'origin']
# If we don't do this, there will be separate rows for origins and destinations
new_df['origin'] = new_df['origin'].fillna(method='ffill')
new_df = new_df.dropna().set_index(['id', 'origin', 'destination'], drop=True)
new_df = new_df.reset_index()[['origin', 'destination', '[0, 2)', '[2, 5)', '[5, 7)', '> 7']].set_index(['origin', 'destination'])
new_df
給你這個:
[0, 2) [2, 5) [5, 7) > 7
origin destination
AB YU 2 2 0 1
CB 2 2 0 1
BA 2 2 0 1
CY 2 2 0 1
YU BA 0 0 2 0
CD YU 2 0 0 1
AB 2 0 0 1
CC 0 0 0 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.