2017-09-14 1 views
2

C'est la question que j'ai posée avant, mais je l'ai expliqué dans le mauvais sens, donc je vais ouvrir une nouvelle question.Appréciez votre aide et le temps!Rowwise dans Pandas

des données d'entrée:

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 

Résultats escomptés:

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 

Mon approche dès maintenant (laid ..):

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 

Ma question ici:

1er. Si je veux utiliser groupby, comment puis-je faire un résultat par calcul impliqué dans le calcul futur, afin d'obtenir la colonne NEW ici.

2ème. Y at-il une fonction pandas comme .Last.value dans R?


Je vais vous expliquer la situation ici:

1. Si la valeur de poids inférieur à 2 doit toujours être 1

2.Dans la première valeur de poids supérieur à 2, il devrait être retour ERROR

3. Si la précédente obtenir « erreur » et la valeur de poids actuelle est rangée plus de 2, il retournera 0

et bien voulu ch ange l'entrée:

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

auriez-vous l'expliquer la logique derrière « ERREUR » valeurs? – MaxU

+0

@MaxU La première valeur de chaque groupe sera 'ERROR' ou '1' – Wen

+0

Je ne comprends toujours pas quand il devrait être' ERROR', quand '1' et quand' 0' ... – MaxU

Répondre

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

Que diriez-vous, changer l'entrée à 'df = pd.DataFrame ({ 'variable': [ "A", "A", "B", "B" , "C", "D", "E", "E", "E", "F", "F", "G"], 'poids': [2,2,0,0,1,3 , 3,9,5,0,0,4]}) ' – Wen

+0

@Wen Cela ne change pas les résultats. La version révisée df par vous commenter les changements au-dessus du deuxième poids de 'e' de' '1' à 9' et n'a donc pas d'impact (tel que confirmé par l'exécution du code). – Alexander

+0

Merci pour l'explication, sera accepté! – Wen

1

Je ne sais pas si je comprends bien la condition correctement de votre boucle, mais cela ressemble à ce

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

On dirait, je pense trop à ce sujet ... – Wen

+0

Oh super :) Juste que vous pourriez vouloir vous assurer que la variable de colonne est triée pour que cela fonctionne. – Vaishali

+0

Désolé, si je change l'entrée de celui-ci, et la sortie devient différente de la vôtre et mon approche – Wen