【问题标题】:Retain function and creation a of new table in python panda as SAS保留功能并在python panda中创建一个新表作为SAS
【发布时间】:2016-11-19 20:37:51
【问题描述】:

最近,我正在从 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;

我在 pandas 中进行了如下尝试,但似乎我犯了一些愚蠢的错误。如果有人知道如何将上述 sas 代码 block3 复制到 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'],as_index=False).first()

我有 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**

【问题讨论】:

  • 能否提供输入和输出数据的示例?
  • 输入将类似于具有 id 列的 10 列的表...并且我需要输出数据应包含 11 列的表,其值在我们的新列中,即 col_2 中的 col_1。也没有。新数据框中的记录也需要相同。
  • 您能否编辑您的问题并包含示例数据?它将使其更具可读性,并让其他人更好地理解您的要求。有关如何做得更好的建议,请参阅 here
  • 感谢您提供的数据,但它并没有说明您要做什么。目前的数据表明简单的df['col4']=df['col1'] 会起作用,但我相信你问的是更复杂的问题。您能否提供数据示例来解释需要做什么?
  • 您能否提供 simple 数据示例,说明您需要什么转换?您提供 SAS 代码作为解释,但我没有使用 SAS 的经验,所以我无法从该代码中理解需要什么。当然,您可以等到知道 SAS 和 pandas 的人出现并回答您的问题,但在我看来,最好让那些只知道 pandas 的人理解您的问题。这将减少您在得到答复之前需要等待的时间。

标签: python pandas dataframe sas


【解决方案1】:

考虑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

【讨论】:

  • 如果 first.ID .. 上面的答案是正确的,那么我想保持这个值不变。但如果不是first.ID,那么我需要更改值如何实现?我的意思是如果 first.ID 对我来说是条件,在此基础上我设置了 if 和 else 值。我将如何为 else 条件设置值??
  • 请重新表述您的评论,因为我无法理解。这里的groupby.first() 与您在上述问题中所需的df1 输出相同(只是更改了ID 排序)。如果您要更改原始要求,请提出单独的 StackOverflow 问题。
  • 我已经编辑了我的问题。我并没有改变我原来的要求,只是添加了一个我需要更新记录的其他条件。基本上我需要将上述 SAS 代码转换为 pandas 或 pyspark
  • 什么是SAS数据输入?我没有看到 col3。
  • 它是数据框中的一个新列,将被添加
【解决方案2】:

形成您尝试过的形式,如果“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

【讨论】:

  • alivar 感谢您的回答。但我的实际要求是将我的 sas 代码转换为 pyspark 或 panda 数据帧。我需要获得与我的熊猫数据帧中相同的 sas 代码结果
  • 就像在 sas 中一样,它被用作 id.first 如果它为真,那么只有它应该将 col1 值分配给 col4,否则将 col4 保持为默认值。而且我不确定首先在熊猫中是如何工作的。与 sas 一样,它将首先将所有 id 分组,然后复制记录
  • 如果您用更清晰的描述更新您的问题,那就太好了。例如,如果 col1 不为空,则不清楚 col4 的值应该是多少。
猜你喜欢
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2020-06-19
  • 2023-01-18
相关资源
最近更新 更多