-1

Ich mache eine Split-Apply-Kombination, um eine Gesamtmenge für jedes Mitglied zu finden. Der Datenrahmen, den ich brauche, sollte 14 Spalten haben: MemberID, DSFS_0_1, DSFS_1_2, DSFS_2_3, DSFS_3_4, DSFS_4_5, DSFS_5_6, DSFS_6_7, DSFS_7_8, DSFS_8_9, DSFS_9_10, DSFS_10_11, DSFS_11_12, DrugCount. Allerdings bekomme ich nicht die 14. (DrugCount), irgendeine Idee warum? Die variablen joined Ausgänge alle 14, aber joined_grouped_add, die Funktion, in der ich Aggregation tun, liefert nur 13.Eine Spalte, die während der Split-Apply-Kombination in Pandas weggelassen wurde

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import sys 
from sklearn.cross_validation import train_test_split 
from sklearn import linear_model 

# this function takes the drugcount dataframe as input and output a tuple of 3 data frames: DrugCount_Y1,DrugCount_Y2,DrugCount_Y3 
def process_DrugCount(drugcount): 
    dc = pd.read_csv("DrugCount.csv") 
    sub_map = {'1' : 1, '2':2, '3':3, '4':4, '5':5, '6':6, '7+' : 7} 
    dc['DrugCount'] = dc.DrugCount.map(sub_map) 
    dc['DrugCount'] = dc.DrugCount.astype(int) 
    dc_grouped = dc.groupby(dc.Year, as_index=False) 
    DrugCount_Y1 = dc_grouped.get_group('Y1') 
    DrugCount_Y2 = dc_grouped.get_group('Y2') 
    DrugCount_Y3 = dc_grouped.get_group('Y3') 
    DrugCount_Y1.drop('Year', axis=1, inplace=True) 
    DrugCount_Y2.drop('Year', axis=1, inplace=True) 
    DrugCount_Y3.drop('Year', axis=1, inplace=True) 
    return (DrugCount_Y1,DrugCount_Y2,DrugCount_Y3) 

# this function converts strings such as "1- 2 month" to "1_2" 
def replaceMonth(string): 
    replace_map = {'0- 1 month' : "0_1", "1- 2 months": "1_2", "2- 3 months": "2_3", "3- 4 months": '3_4', "4- 5 months": "4_5", "5- 6 months": "5_6", "6- 7 months": "6_7", \ 
        "7- 8 months" : "7_8", "8- 9 months": "8_9", "9-10 months": "9_10", "10-11 months": "10_11", "11-12 months": "11_12"} 
    a_new_string = string.map(replace_map) 
    return a_new_string 

# this function processes a yearly drug count data 
def process_yearly_DrugCount(aframe): 
    processed_frame = None 
    aframe.drop("Year", axis = 1, inplace = True) 
    reformed = aframe[['DSFS']].apply(replaceMonth) 
    gd = pd.get_dummies(reformed) 
    joined = pd.concat([aframe, gd], axis = 1) 
    joined.drop("DSFS", axis = 1, inplace = True) 
    joined_grouped = joined.groupby("MemberID", as_index = False) 
    joined_grouped_agg = joined_grouped.agg(np.sum) 
    print joined_grouped_agg 
    return processed_frame 
def main(): 
    pd.options.mode.chained_assignment = None 
    daysinhospital = pd.read_csv('DaysInHospital_Y2.csv') 
    drugcount = pd.read_csv('DrugCount.csv') 
    process_DrugCount(drugcount) 
    process_yearly_DrugCount(drugcount) 
    replaceMonth(drugcount['DSFS']) 

if __name__ == '__main__': 
    main() 
+0

Und wo sind die lin es, die die Funktion (en) aufrufen? – Parfait

+0

@Parfait Bearbeitete es. – squidvision

+0

Auch hier passiert zu viel, um zu helfen. Ich rate, jedes Teil zu brechen und Druckanweisungen hinzuzufügen, um Inhalt zu sehen, um zu sehen, wo Spalte entfernt wird. Andernfalls richten Sie ein [reproduzierbares Beispiel] (http://stackoverflow.com/help/mcve) ein. – Parfait

Antwort

0

Einfach gesagt, DrugCount direkt von csv gezogen wird, nicht als numerisches Feld (int/float) Lesen in . Sonst würde es in der .agg(np.sum) Verarbeitung beibehalten werden. Vor der Aggregation die dtype prüfen und sehen, ob es eine ist object Typ (dh String-Spalten):

print joined['DrugCount'].dtype 

In der Tat, in Ihrer process_DrugCount() Funktion explizit DrugCount Spalt in integer mit AsType konvertieren, aber nicht tun, so in process_yearly_DrugCount() Funktion. Führen Sie in derselben Zeile in letztere Funktion und DrugCount sollte in Gesamtsumme Verarbeitung beibehalten werden:

aframe['DrugCount'] = aframe['DrugCount'].astype(int) 

Oder noch besser, in main() zu tun Umwandlung zweimal in letzteren Funktionen zu vermeiden:

drugcount['DrugCount'] = drugcount['DrugCount'].astype(int) 

auch tun Anmerkung, read_csv() ermöglicht explizite Benennung der Spalten-Typen mit ihren dtype Argument:

drugcount = pd.read_csv('DrugCount.csv', dtype={'DrugCount': np.int64})