2016-11-19 35 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

相關問題