2016-11-19 46 views
0

最近,我正在将SAS转换为Python熊猫。我有一个问题,大熊猫在SAS中是否具有保留功能。在python熊猫中保留函数并创建一个新表格作为SAS

我的SAS代码:

data df1; 
retain col3 " "; 
set df; 
by ID ; 
if first.ID then col3=col1; 
else col3=col3; 

其他条件我已经是在SAS代码:

data df1; 
retain col3; 
set df; 
by ID ; 
if first.ID then col3=1; 
else col3=col3+1; 
如下所示 对此我试图转换

下一页SAS代码:

proc sql; 
    create table t1 as 
    select 
     c1, c2, c3, c4, c5, flag, max(flag) as MAX_flag 
    from t1 
    group by c1, c2, c3, c5; 
    run; 

我在熊猫身上试过它,但看起来我犯了一些愚蠢的错误。如果有人知道如何复制sas代码块3到熊猫

t1=t1[['c1','c2','c3','c4','c5','c6']] 
    t1.loc[:,'Max_flag']=t1['flag'].max() 
    t1.groupby(['c1','c2','c3','c5']) 

在我的例如。 col3是B,col1是a。 在其上它应该做的条件是 df.groupby([ 'ID'],as_index =假)。首先()

我有2列ID,A. 我的要求是输入数据DF1:

ID A 
    1 a 
    1 b 
    2 c 
    1 p 
    2 q 

输出数据帧应该有一个列名称为B.它将按ID.first()进行分组。并将col A的数据复制到col B以获得所有分组的ID。

输出应该DF1

ID A B 
    1 a a 
    1 b a 
    2 c c 
    1 p a 
    2 q c 

**My key requirement is to convert above SAS code to Pnadas** 
+0

能否请您提供输入和输出数据的例子吗? –

+0

输入将像是表格10列有id列...我需要输出数据应该包含11列与我们的新列中的值,即col_1 col_2。也没有。的记录在新的数据框中也必须相同。 – user07

+0

您能否编辑您的问题并添加示例数据?它会使它更加可读,并让其他人更好地理解你问什么。请参阅[这里](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)关于如何做得更好的建议。 –

回答

0

它看起来像(形成你已经试过的),你想拥有“COL4”等于“COL2”如果“COL1”不为空,否则“COL4”应该是空白的。所以你不需要分组。 这里是你怎么做的情况下,我在这里所说的情况:

In [80]: df = pd.DataFrame([[1,'a','b','c'],[2,'e','r','g'], [3,'BLANK', '', '']], columns=['ID','col1', 'col2','col3']) 

In [81]: df 
Out[81]: 
    ID col1 col2 col3 
0 1  a b c 
1 2  e r g 
2 3 BLANK   

In [82]: df['col4'] = np.where(df['col1'] == 'BLANK', 'BLANK', df['col2']) 

In [83]: df 
Out[83]: 
    ID col1 col2 col3 col4 
0 1  a b c  b 
1 2  e r g  r 
2 3 BLANK   BLANK 
+0

alivar谢谢你的回答。但我的实际要求是将我的sas代码转换为pyspark或熊猫数据框。我需要得到与我的熊猫数据框 – user07

+0

中sas代码相同的结果,如sas中它被用作id.first,如果它是真的,那么只有它应该分配col1值给col4,否则保留col4作为默认值。而且我也不确定熊猫的第一个作品。在sas中,它会先将所有的id分组,然后复制记录 – user07

+1

如果用更清晰的描述来更新您的问题,那将会很棒。例如,如果col1不是空白,col4应该是什么值。 – Ali

2

考虑一个mergegroupby.first()

df = df.merge(df.groupby('ID').first().reset_index(), on='ID').rename(columns={'A_x':'A', 'A_y':'B'}) 

# ID A B 
# 0 1 a a 
# 1 1 b a 
# 2 1 p a 
# 3 2 c c 
# 4 2 q c 

这也可以用groupby.nth()这是从零开始的推广。下面需要在每个ID的第二个值:

df = df.merge(df.groupby('ID').nth(1).reset_index(), on='ID').rename(columns={'A_x':'A', 'A_y':'B'}) 

# ID A B 
# 0 1 a b 
# 1 1 b b 
# 2 1 p b 
# 3 2 c q 
# 4 2 q q 

而且还有groupby.last()

df = df.merge(df.groupby('ID').last().reset_index(), on='ID').rename(columns={'A_x':'A', 'A_y':'B'}) 

# ID A B 
# 0 1 a p 
# 1 1 b p 
# 2 1 p p 
# 3 2 c q 
# 4 2 q q 
+0

上面的答案是正确的,如果first.ID ..然后我想保持相同的价值。但如果不是first.ID,然后我需要更改值我如何实现这一目标?我的意思是,如果first.ID是我的条件,在这个基础上,我设置了值,如果等。我将如何为其他条件设置价值? – user07

+0

请重新评价您的评论,因为我无法理解。 'groupby.first()'在这里产生与你想要的'df1'输出相同的结果(只是改变了ID的排序)。如果您正在更改原始要求,请提出一个单独的StackOverflow问题。 – Parfait

+0

我编辑了我的问题。我不改变我原来的要求只是添加一个其他条件,我需要更新记录。基本上我需要将以上SAS代码转换为pandas或pyspark – user07