2017-09-14 7 views
2

これは私が以前に尋ねた質問ですが、間違った方法で説明しましたので、もう一度新しい質問を開きます。あなたの助けと時間を感謝してください!パンダの横列

データ入力:

df=pd.DataFrame({'variable':["A","A","B","B","C","D","E","E","E","F","F","G"],'weight':[2,2,0,0,1,3,3,1,5,0,0,4]}) 
df 
Out[447]: 
    variable weight 
0   A  2 
1   A  2 
2   B  0 
3   B  0 
4   C  1 
5   D  3 
6   E  3 
7   E  1# If value more than 2 , out put should be 0 
8   E  5 
9   F  0 
10  F  0 
11  G  4 

予想される出力:

df 
Out[449]: 
    variable weight NEW 
0   A  2  1 
1   A  2  1 
2   B  0  1 
3   B  0  1 
4   C  1  1 
5   D  3 ERROR 
6   E  3 ERROR 
7   E  1  1 
8   E  5  1 
9   F  0  1 
10  F  0  1 
11  G  4 ERROR 

今のように私のアプローチ(醜い...):ここ

l1=[] 
for i in df.variable.unique(): 
    temp=df.loc[df.variable==i] 
    l2 = [] 
    for j in range(len(temp)): 
     print(i,j) 

     if temp.iloc[j,1]<=2 : 
      l2.append(1) 
     elif temp.iloc[j,1]>2 and j==0: 
      l2.append('ERROR') 
     elif temp.iloc[j,1]>2 and j > 0 : 
      if l2[j - 1] == 1: 
       l2.append(1) 
      else: 
       l2.append(0) 
     print(l2) 
    l1.extend(l2) 
df['NEW']=l1 

私の質問:

第1groupbyを使用する場合は、ここでNEW列を取得するために、計算結果を将来の計算に含めるにはどうすればよいですか。

第2.Last.valueのようなpandasの機能はRにありますか?


私はここに状態を説明します

:2未満重量の値1.If

は常に2よりも高い重量の最初の値2.Ifは1

である必要があり、それはする必要があります「エラー」と重み値現在の行を取得し、前の3.IfはERROR

を返すことは、それが0

そして親切CHを返します2以上のものですANGE入力に:

df=pd.DataFrame({'variable':["A","A","B","B","C","D","E","E","E","F","F","G"],'weight':[2,2,0,0,1,3,3,9,5,0,0,4]}) 
+3

あなたが「ERROR」の背後にあるロジックを説明いただけませんようにこれが見えます値? – MaxU

+0

@MaxU各グループの最初の値は 'ERROR'または' 1'のいずれかになります – Wen

+0

'ERROR'、' 1'と '0'のときはまだ理解できません... – MaxU

答えて

1
n = 2 # `Error` weight filter. 
# Get boolean index of whether weight of first item in group is greater than `n`. 
mask = df.loc[[idx[0] for idx in df.groupby('variable')['weight'].groups.values()], 'weight'].gt(n) 
df = df.assign(New=1) 
df.loc[mask[mask].index, 'New'] = 'ERROR' 
>>> df 
    variable weight New 
0   A  2  1 
1   A  2  1 
2   B  0  1 
3   B  0  1 
4   C  1  1 
5   D  3 ERROR 
6   E  3 ERROR 
7   E  1  1 
8   E  5  1 
9   F  0  1 
10  F  0  1 
11  G  4 ERROR 
+0

「df = pd.DataFrame({'variable':["A"、 "A"、 "B"、 "B" 「C」、「D」、「E」、「E」、「E」、「F」、「F」、「G」〕、「重み」:[2,2,0,0,1,3 、3,9,5,0,0,4]}) ' – Wen

+0

@Wenこれは結果を変更しません。上記のコメントごとにdfを変更すると、 'E'の第2の重みが '1'から '9'に変更されるため、影響はありません(コードの実行によって確認されます)。 – Alexander

+0

説明をありがとう、受け入れられる! – Wen

1

私はあなたのループから正しく状況を理解している場合、私はわからないが、それは

df['New'] = np.where((df['weight'] > 2) & (df['variable'] != df['variable'].shift(1)), 'ERROR', 1) 

    variable weight New 
0 A   2  1 
1 A   2  1 
2 B   0  1 
3 B   0  1 
4 C   1  1 
5 D   3  ERROR 
6 E   3  ERROR 
7 E   1  1 
8 E   5  1 
9 F   0  1 
10 F   0  1 
11 G   4  ERROR 
+0

のように思える、私はそれについて多くのことを考えている... – Wen

+0

ああ素晴らしい:)ちょうどあなたは、これが動作するように列の変数がソートされていることを確認することがあります。 – Vaishali

+0

申し訳ありませんが、私はそれの入力を変更し、出力があなたと私のアプローチ – Wen