Dostarczę dane dla niektórych wiosek, dla przykładowych danych, zobacz załącznik. Wprowadź opis obrazu tutaj .

Village Yield(in Kg)    Date
Village1    0.22    01/06/18
Village1    0.23    02/06/18
Village1    0.55    01/06/18
Village1    0.2     02/06/18
Village2    0.88    31/05/18
Village2    0.89    30/05/18
Village2    0.63    30/05/18
Village2    0.55    30/05/18

Teraz chcę pokazać, że wioski odpowiadające dane wydajności z datą eksperymentu.So, Village1 ma 4 wartości wydajności.

Proszę zobaczyć załącznik. Wprowadź opis obrazu tutaj

Village     Yield-1                Yield-2              Yield-3 
Village1    0.22    01/06/18        0.23    02/06/18    0.55    01/06/18    

Każda pomoc będzie pomocna. Dzięki

3
Kiran 4 czerwiec 2018, 14:08

3 odpowiedzi

Najlepsza odpowiedź

Posługiwać się:

df = (df.set_index(['Village', df.groupby('Village').cumcount().add(1)])
        .unstack()
        .sort_index(axis=1, level=1))

df.columns = ['{}-{}'.format(x, y) for x, y in df.columns]
df = df.reset_index()
print (df)
    Village  Yield(in Kg)-1    Date-1  Yield(in Kg)-2    Date-2  \
0  Village1            0.22  01/06/18            0.23  02/06/18   
1  Village2            0.88  31/05/18            0.89  30/05/18   

   Yield(in Kg)-3    Date-3  Yield(in Kg)-4    Date-4  
0            0.55  01/06/18            0.20  02/06/18  
1            0.63  30/05/18            0.55  30/05/18  

Wyjaśnienie :

  1. Najpierw {x0}} z grupami stworzony przez GroupBy.cumcount i unstack dla przekształcenia
  2. Sortuj drugi poziom MultiIndex by {{ X1}}
  3. Flatten Multiindex w kolumnach z rozumieniem listy
  4. Utwórz kolumnę z indeksu przez {X0}} .
1
jezrael 4 czerwiec 2018, 11:22

Spróbuj tego,

df.groupby(['Village']).apply(lambda x:pd.Series(zip(x['Yield(in Kg)'],x['Date']))).reset_index()


    Village                 0                 1                 2  \
0  Village1  (0.22, 01/06/18)  (0.23, 02/06/18)  (0.55, 01/06/18)   
1  Village2  (0.88, 31/05/18)  (0.89, 30/05/18)  (0.63, 30/05/18)   

                  3  
0   (0.2, 02/06/18)  
1  (0.55, 30/05/18)

Aby zmienić nazwę kolumn:

col1=df.filter(regex='\d+').columns.values
col2=['Yield - '+str(col+1) for col in col1]
df.rename(columns= dict(zip(col1,col2)),inplace=True)

    Village         Yield - 1         Yield - 2         Yield - 3  \
0  Village1  (0.22, 01/06/18)  (0.23, 02/06/18)  (0.55, 01/06/18)   
1  Village2  (0.88, 31/05/18)  (0.89, 30/05/18)  (0.63, 30/05/18)   

          Yield - 4  
0   (0.2, 02/06/18)  
1  (0.55, 30/05/18)
0
Mohamed Thasin ah 4 czerwiec 2018, 11:41

Spróbuj użyć groupby, a następnie ustaw wartości, a następnie przekonwertować group do słownika, a następnie utwórz ramkę danych z słownika, a następnie przetransponuj, a następnie utwórz nową kolumnę dla średniej przy użyciu mean:

import pandas as pd
df = pd.DataFrame({'Village': ['Village1', 'Village1',
                               'Village1', 'Village1', 'Village2',
                               'Village2', 'Village2', 'Village2'],
                   'Yield (in kg)': [0.22,0.23,0.55,0.2, 0.88, 0.89, 0.63, 0.55]})
group = df.groupby('Village')['Yield (in kg)'].apply(lambda x: x.values)
df = pd.DataFrame(group.to_dict()).T
df.columns = df.columns.astype(str)
df['Average'] = df.mean(axis=1)
print(df)

Wynik:

          0     1     2     3      Average
Village1  0.22  0.23  0.55  0.20   0.3000
Village2  0.88  0.89  0.63  0.55   0.7375

Aby zmienić nazwę kolumn:

df.columns = ['Yield (in kg)-'+i for i in df.columns if i != 'Average']

Wynik:

          Yield (in kg)-0  Yield (in kg)-1  Yield (in kg)-2  Yield (in kg)-3   /
Village1   0.22             0.23             0.55             0.20   
Village2   0.88             0.89             0.63             0.55   

                         Average  
Village1                 0.3000  
Village2                 0.7375
1
U11-Forward 4 czerwiec 2018, 23:38