2016-07-08 90 views
0

的分組部我需要幫助樞軸旋轉數據框重塑和數據幀

data = [{'Start Date': '12/3/2016', 
    'End Date': '12/4/2016', 
    'Name':'John'}, 
    {'Start Date':'12/3/2016', 
    'End Date': '12/4/2016', 
    'Name':'Karen'}, 
    {'Start Date': '12/1/2016', 
    'End Date': '12/2/2016', 
    'Name':'John'}, 
    {'Start Date':'12/1/2016', 
    'End Date': '12/2/2016', 
    'Name':None}, 
{'Start Date': '12/5/2016', 
    'End Date': '12/6/2016', 
    'Name':'Jeff'}, 
    {'Start Date':'12/5/2016', 
    'End Date': '12/6/2016', 
    'Name':'John'}] 
df = pd.DataFrame(data) 
df 

Output

我需要它看起來像this。只要他們列出,哪個人名字列出來就沒有關係。

+0

它似乎並沒有是PERSON1和person2是任何不同的,只是他們碰巧在相同的開始和結束範圍內。你的框架中每個範圍會有兩個人嗎?什麼是用例? – breucopter

+0

我真的很感興趣看到一個答案,它概括了有隨機數的人,不一定是普通的夫妻行的情況! – Valilutzik

回答

0

考慮與數據幀本身就是一個合併的方式(類似於SQL的自聯接),然後過濾器不匹配的名稱和第一配對與組數:

mdf = pd.merge(df, df, on='End Date') 
mdf['grp'] = mdf.groupby('End Date').cumcount()  
#  End Date Name_x Start Date_x Name_y Start Date_y grp 
# 0 12/4/2016 John 12/3/2016 John 12/3/2016 0 
# 1 12/4/2016 John 12/3/2016 Karen 12/3/2016 1 
# 2 12/4/2016 Karen 12/3/2016 John 12/3/2016 2 
# 3 12/4/2016 Karen 12/3/2016 Karen 12/3/2016 3 
# 4 12/2/2016 John 12/1/2016 John 12/1/2016 0 
# 5 12/2/2016 John 12/1/2016 None 12/1/2016 1 
# 6 12/2/2016 None 12/1/2016 John 12/1/2016 2 
# 7 12/2/2016 None 12/1/2016 None 12/1/2016 3 
# 8 12/6/2016 Jeff 12/5/2016 Jeff 12/5/2016 0 
# 9 12/6/2016 Jeff 12/5/2016 John 12/5/2016 1 
# 10 12/6/2016 John 12/5/2016 Jeff 12/5/2016 2 
# 11 12/6/2016 John 12/5/2016 John 12/5/2016 3 

mdf = mdf[(mdf['Name_x'] != mdf['Name_y']) & (mdf['grp']==1)]  # FILTER ROWS 
#  End Date Name_x Start Date_x Name_y Start Date_y grp 
# 1 12/4/2016 John 12/3/2016 Karen 12/3/2016 1 
# 5 12/2/2016 John 12/1/2016 None 12/1/2016 1 
# 9 12/6/2016 Jeff 12/5/2016 John 12/5/2016 1 

mdf = mdf[['End Date', 'Name_x', 'Name_y', 'Start Date_x']].\  
     sort_values(['End Date']).reset_index(drop=True)   # SUBSET COLUMNS 
mdf.columns = ['End Date', 'Person 1', 'Person 2', 'Start Date'] # RE-NAME COLUMNS 
#  End Date Person 1 Person 2 Start Date 
# 0 12/2/2016  John  None 12/1/2016 
# 1 12/4/2016  John Karen 12/3/2016 
# 2 12/6/2016  Jeff  John 12/5/2016