2017-02-04 14 views
2

Dies ist offensichtlich einfach, aber als Pandas Newbe ich bleibe stecken.Pandas Division von zwei Spalten mit groupby

Ich habe eine CSV-Datei, die 3 Spalten enthält, den Status, bene_1_count und bene_2_count.

Ich möchte das Verhältnis von 'bene_1_count' und 'bene_2_count' in einem bestimmten Zustand berechnen.

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 
      'bene_1_count': [np.random.randint(10000, 99999) 
        for _ in range(12)], 
      'bene_2_count': [np.random.randint(10000, 99999) 
        for _ in range(12)]}) 

Ich versuche, die folgenden, aber es ist mir ein Fehler geben: ‚Keine Objekte zu verketten‘

df['ratio'] = df.groupby(['state']).agg(df['bene_1_count']/df['bene_2_count']) 

Ich bin, um herauszufinden, nicht in der Lage, wie man „erreichen up“ auf die Zustandsebene der Gruppe, um das Verhältnis von Spalten zu nehmen.

möchte ich das Verhältnis von Spalten w.r.t einem Zustand, wie ich meine ausgegeben werden soll, wie folgt:

State  ratio 

    CA 
    WA 
    CO 
    AZ 

Antwort

2

Alternativ, angegeben: Sie können benutzerdefinierte Funktionen erstellen, die einen Datenrahmen akzeptieren. Die Gruppe gibt Sub-Datenrahmen zurück. Sie können dann die Funktion "Anwenden" verwenden, um Ihre benutzerdefinierte Funktion auf jeden Subdatenrahmen anzuwenden.

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 
      'bene_1_count': [np.random.randint(10000, 99999) 
        for _ in range(12)], 
      'bene_2_count': [np.random.randint(10000, 99999) 
        for _ in range(12)]}) 

def divide_two_cols(df_sub): 
    return df_sub['bene_1_count'].sum()/float(df_sub['bene_2_count'].sum()) 

df.groupby('state').apply(divide_two_cols) 

Jetzt sagen Sie jede Zeile wollen durch die Summe der einzelnen Gruppen aufgeteilt werden (beispielsweise die Gesamtsumme von AZ) und auch alle ursprünglichen Spalten beibehalten. Passen Sie einfach die obige Funktion an (

def divide_two_cols(df_sub): 
    df_sub['divs'] = df_sub['bene_1_count']/float(df_sub['bene_2_count'].sum()) 
    return df_sub 

df.groupby('state').apply(divide_two_cols) 
0

Ich glaube, was Sie zuerst tun müssen, ist die Summe der Zählungen nach Zustand vor, das Verhältnis zu finden. Sie können apply verwenden, um auf die anderen Spalten im df zuzugreifen, und diese dann in einem Dictionary speichern, um sie dem entsprechenden Status im ursprünglichen Datenrahmen zuzuordnen.

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 
      'bene_1_count': [np.random.randint(10000, 99999) 
         for _ in range(12)], 
      'bene_2_count': [np.random.randint(10000, 99999) 
         for _ in range(12)]}) 

ratios = df.groupby('state').apply(lambda x: x['bene_1_count'].sum()/
            x['bene_2_count'].sum().astype(float)).to_dict() 

df['ratio'] = df['state'].map(ratios) 
+0

Danke..es funktioniert ... aber es gibt einen Serientyp zurück, aber ich möchte das berechnete Verhältnis an die Spalte anhängen der Datenrahmen wie df ['ratio'] .. – Sanjeev

+0

Ich habe meinen Beitrag aktualisiert, um die Verhältnisse wieder zum ursprünglichen Datenrahmen hinzuzufügen. Ist das das Ergebnis, nach dem Sie gesucht haben? – rtk22

+0

Super ... es funktioniert .. – Sanjeev