-1

各メンバーの合計数量を見つけるために分割適用結合を行っています。必要なデータフレームには 14 列が必要です: 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. しかし、14 番目のもの ( DrugCount) を取得していません。変数joinedは 14 個すべてを出力しますがjoined_grouped_add、集計を行う関数は 13 個しか返しません。

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()
4

1 に答える 1

0

簡単に言えば、DrugCountcsv から直接取得したものは、数値フィールド (int/float) として読み込まれません。そうしないと、.agg(np.sum)処理中に保持されます。集計の前に dtype をチェックし、それがobject型 (つまり、文字列列) であるかどうかを確認します。

print joined['DrugCount'].dtype

実際、process_DrugCount()関数では、DrugCount 列を astype で明示的に整数に変換しますが、関数ではそうしませんprocess_yearly_DrugCount()。後者の関数で同じ行を実行すると、集計合計処理で DrugCount を保持する必要があります。

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

またはmain()、後者の関数で 2 回変換を行うことを避けるために、さらに良いこと:

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

また、read_csv()では、 dtype引数を使用して列の型を明示的に指定できることに注意してください。

drugcount = pd.read_csv('DrugCount.csv', dtype={'DrugCount': np.int64})
于 2016-04-13T02:18:14.440 に答える