2016-09-25 114 views
0

大熊貓沒有太多的經驗,搜索的線程,但無法找到類似的東西。大熊貓轉換表

我有大1mil的記錄表如下結構,

+-------+-------+-------------+-----------+ 
| rec | code | code group | code Date | 
+-------+-------+-------------+-----------+ 
| 10001 | X11 | High  | 20151105 | 
| 10001 | X11.1 | High  | 20150205 | 
| 10001 | X12 | Medium  | 20141111 | 
| 10001 | X12.1 | Medium  | 20141111 | 
| 10001 | X13 | Low   | 20130101 | 
| 10001 | Y15 | No Interest | 20130101 | 
| 10001 | Y16 | No Interest | 20141231 | 
| 10002 | X11 | …   | …   | 
| 10002 | X12 | …   | …   | 
| 10002 | X13 | …   | …   | 
+-------+-------+-------------+-----------+ 

,並想將其構建到表中只有唯一的REC將駐留在以下格式:

頁眉: REC |高(最大日期)|中(最大日期)|低(最大日期)|代碼(H只有最大日期)|高代碼(計數)

+2

請通過查看問題將表格格式化爲可理解的內容。我爲你的輸入做了這個,但不能爲輸出做。 –

+0

對不起,這是第一次...忘了表。 thanx – pythonED

+0

預期結果仍不明確(高代碼(最大日期))。你能給我們一個例子嗎? – Romain

回答

0

這裏有一些線索。

# Test data 
df = DataFrame({'rec': [10001, 10001, 10002, 10002], 
'code': ['X11', 'X12', 'X11.1', 'X12'], 
'code group': ['High', 'High', 'High', 'Medium'], 
'code Date': ['20151105', '20141111', '20151004', '20151004'] 
}, columns = ['rec', 'code', 'code group', 'code Date']) 

# Converting dates 
df['code Date'] = pd.to_datetime(df['code Date']) 

#  rec code code group code Date 
# 0 10001 X11  High 2015-11-05 
# 1 10001 X12  High 2014-11-11 
# 2 10002 X11.1  High 2015-10-04 
# 3 10002 X12  Medium 2015-10-04 

這如何讓「REC,高(最大日),中(大日),低(最大日)」

pivot = pd.pivot_table(df, 
       index = 'rec', 
       columns='code group', 
       values='code Date', 
       aggfunc='max') 

# code group  High  Medium 
# rec        
# 10001  2015-11-05  NaT 
# 10002  2015-10-04 2015-10-04 

該如何獲得最高的日期代碼,行數的數量。

# Filterting and sorting the values in order to have last dates first 
filt = df[df['code group'] == 'High'].sort_values(['rec', 'code Date'], ascending=[True, False]) 
# Keeping the first value for code (the one with last date), and counting the rows 
filt = filt.groupby('rec').agg({'code': 'first', 'code Date': 'size'}) 

#  code Date code 
# rec      
# 10001   2 X11 
# 10002   1 X11.1 

組裝數據以獲得最終結果。

pivot.join(filt).rename(columns={'code Date': 'count'}) 

# code group  High  Medium count code 
# rec           
# 10001  2015-11-05  NaT  2 X11 
# 10002  2015-10-04 2015-10-04  1 X11.1 
+0

Thanx評論,遺憾的結果表的格式問題。我也已經達到了代碼的第一部分,但想要將代碼組轉換爲標題,並且記錄了最大日期 – pythonED

+0

Thanx作爲數據透視表,兩個10001記錄將失效並通過添加兩列來解決問題。第一列將讀取代碼(即「X11」)爲高,並且一個記錄的最大日期;第二個將讀取一個記錄的高數。 Thanx希望它是有道理的 – pythonED

+0

thanx,我假設添加新的列到df樞軸將是simpel添加new_series。 – pythonED