保留功能并在python panda中创建新表作为SAS

时间:2016-11-19 20:37:51

标签: python pandas dataframe sas

最近,我正在从SAS转换为Python pandas。我的一个问题是,大熊猫在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复制到pandas

  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&#39],as_index =假)。首先()

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

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

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

输出应为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**

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果'col1'不是空白,那么你想要'col4'等于'col2'看起来像你已经尝试过的那样,否则'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