2016-11-27 3 views
3

연간 데이터 (각각 2014 년, 2015 년 및 2016 년)에 대해 3 데이터 프레임 (각각 'PRACTICE', 'BNF NAME', 'ITEMS')이 3 개 있습니다.pandas python을 사용하여 누적 막 대형 차트를 플롯하는 방법

BNF NAME은 약물 이름을 말하며 3 개의 암피실린, 아목시실린 및 Co-Amoxiclav를 골라냅니다. 이 칼럼은 다른 강도/용량 (예 : Co-Amoxiclav 200mg 또는 Co-Amoxiclav 300mg 등)을 무시하고 싶기 때문에 str.contains()을 사용하여이 3 가지 약물을 선택했습니다. ITEMS은 각 약물에 대해 작성된 처방전의 총 수입니다.

x 축을 연도 (2014, 2014, 2015)로하고 y 축을 총 처방 수로하여 누적 막 대형 차트를 만들고 각 약물에 대해 3 개로 분할 할 3 개의 막대 이름.

내가 df.groupby()을 사용해야한다고 가정하고 있지만 어쩌면 부분 문자열을 선택할 수도 있습니다. 그러나 연간 데이터를 결합하는 방법과 누적 막 대형 차트를 만들기 위해 데이터를 그룹화하는 방법을 잘 모릅니다.

모든 안내를 주시면 감사하겠습니다.

이것은 3 개의 약 이름에 대해서만 행을 선택하는 데 사용하는 코드 행입니다.

frame=frame[frame['BNF NAME'].str.contains('Ampicillin' and 'Amoxicillin' and 'Co-Amoxiclav')] 

이는 dataframes의 각과 유사한 것입니다 :

가능성이 작업을 수행 할 수있는 몇 가지 방법이있을거야
PRACTICE | BNF NAME | ITEMS 
Y00327 | Co-Amoxiclav_Tab 250mg/125mg | 23 
Y00327 | Co-Amoxiclav_Susp 125mg/31mg/5ml S/F | 10 
Y00327 | Co-Amoxiclav_Susp 250mg/62mg/5ml S/F | 6 
Y00327 | Co-Amoxiclav_Susp 250mg/62mg/5ml | 1 
Y00327 | Co-Amoxiclav_Tab 500mg/125mg | 50 
+0

플롯팅을 쉽게하기 위해 아마 세 개의 데이터 프레임을 하나의 데이터 프레임으로 결합하고자 할 것입니다. 실제 데이터의 작은 하위 집합 ('frame.head (5) .to_dict()')을 게시하면 더 빨리 당신을 도울 수있을 것입니다. – DataSwede

+0

@DataSwede pd.concat()을 사용하고 있다고 가정합니다. 제가 추가 한 데이터 프레임 레이아웃의 스냅 샷을보십시오. –

+0

@DataSwede 이것을 시도 할 때 결과 막대 차트는 누적되지 않습니다. 즉, 하나의 약물 (Co-amoxiclav)이있는 표준 막대 차트와 같습니다. 왜 그런가? 누락 된 값을 처리하기 위해 .fillna (False)를 추가했습니다.이 값과 관련이 있는지 여부는 확실하지 않습니다. –

답변

1

. 방법은 다음과 같습니다. jupiter 노트북을 사용하고 있으므로 matplotlib 가져 오기가 다를 수 있습니다.

import pandas as pd 
%matplotlib 
import matplotlib.pyplot as plt 
import matplotlib 
matplotlib.style.use('ggplot') 

df = pd.DataFrame({'PRACTICE': ['Y00327', 'Y00327', 'Y00327', 'Y00327', 'Y00327'], 
        'BNF NAME': ['Co-Amoxiclav_Tab 250mg/125mg', 'Co-Amoxiclav_Susp 125mg/31mg/5ml S/F', 
           'Co-Amoxiclav_Susp 250mg/62mg/5ml S/F', 'Ampicillin 250mg/62mg/5ml', 
           'Amoxicillin_Tab 500mg/125mg'], 
        'ITEMS': [23, 10, 6, 1, 50]}) 



Out[52]: 
BNF NAME ITEMS PRACTICE 
0 Co-Amoxiclav_Tab 250mg/125mg 23 Y00327 
1 Co-Amoxiclav_Susp 125mg/31mg/5ml S/F 10 Y00327 
2 Co-Amoxiclav_Susp 250mg/62mg/5ml S/F 6 Y00327 
3 Ampicillin 250mg/62mg/5ml 1 Y00327 
4 Amoxicillin_Tab 500mg/125mg 50 Y00327 

은 세 dataframes을 시뮬레이션하려면

df1 = df.copy() 
df2 = df.copy() 
df3 = df.copy() 

dataframe가 무엇을 나타내는 지 올해를 나타내는 열을 설정합니다.

df1['YEAR'] = 2014 
df2['YEAR'] = 2015 
df3['YEAR'] = 2016 

합성 세 dataframes : 마지막

combined_df['parsed_drug_name'] = "" # creates a blank column 
amp_bool = combined_df['BNF NAME'].str.contains('Ampicillin', case=False) 
combined_df.loc[amp_bool, 'parsed_drug_name'] = 'Ampicillin' # sets the row to amplicillin, if BNF NAME contains 'ampicillin.' 

amox_bool = combined_df['BNF NAME'].str.contains('Amoxicillin', case=False) 
combined_df.loc[amox_bool, 'parsed_drug_name'] = 'Amoxicillin' 

co_amox_bool = combined_df['BNF NAME'].str.contains('Co-Amoxiclav', case=False) 
combined_df.loc[co_amox_bool, 'parsed_drug_name'] = 'Co-Amoxiclav' 

를 데이터에 피봇을 수행하고, 그 결과를 플롯 :

combined_df = pd.concat([df1, df2, df3], ignore_index=True) 

각 행이 무엇을 나타내는 약물 설정하기

combined_df.pivot_table(index='YEAR', columns='parsed_drug_name', values='ITEMS', aggfunc='sum').plot.bar(rot=0, stacked=True) 

Stack Bar Plot

+2

@MaxU- 맞습니다. 감사! – DataSwede

+0

제가 이것을 시도 할 때 결과 막대 차트는 누적되지 않습니다. 즉, 하나의 약물 (Co-amoxiclav)이있는 표준 막 대형 차트와 같습니다. 그 이유는 무엇입니까? –

+0

.fillna (False)를 추가하는 것과 관련이 있는지 확실하지 않은 경우 –