最近,我正在从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**
答案 0 :(得分:2)
考虑merge
与groupby.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