2016-09-25 113 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