<jupyter_start><jupyter_text>기술 통계 계산과 요약  요약 통계 |메서드|설명||---|---||head,tail|series나 dataframe의 몇 개 데이터만 보여줌||describe|series나 dataframe의 각 컬럼에 대한 요약 통계||count| na 값을 제외한 값의 개수를 반환||min, max| 최소값, 최대값||argmin, argmax|최소값, 최대값을 가진 색인의 위치(정수)를 반환||idxmin, idxmax|최소값, 최대값을 가진 색인의 값을 반환||sum|합||mean, median|평균, 중앙값||var, std|분산, 표준편차|* pandas 객체의 기술 통계는 누락된 데이터를 배제하고 처리함.<jupyter_code>stock = pd.read_csv('stock_2020_01.csv', 
                    encoding = "euc-kr")
stock.head()
frame = pd.DataFrame([[10, 4, 'a'], [10, 2.5, 'b'], [np.nan, 10, 'a']], 
                     index=['i1', 'i2', 'i3'],
                      columns=['c1', 'c2', 'c3'])
frame
frame.describe()
frame.describe(include='object')
frame.describe(include='all')
frame.max()
frame.min(axis=1)
frame.sum()<jupyter_output><empty_output><jupyter_text>unique, value_counts |메서드|설명||---|---||unique|series에서 중복되는 값을 제외하고 유일값만 포함하는 배열을 반환.||value_conuts|series에서 유일값에 대한 색인과 도수를 계산|<jupyter_code>obj = pd.Series([2, 1, 3, 3, 1, 5, np.nan, 1, 2])
obj
obj.unique()
obj.value_counts()
# normalize
obj.value_counts(normalize=True)
obj = pd.Series(list('abcabcaaa')+[None])
obj
obj.unique()
obj.value_counts()<jupyter_output><empty_output><jupyter_text>정렬   Series 정렬 * Series.sort_index : index를 기준으로 정렬* Series.sort_values: values를 기준으로 정렬<jupyter_code>obj = pd.Series([1,2,3,-1,-2], index=list('adebc'))
obj
obj.sort_index()
obj.sort_index(ascending=False)
obj.sort_values()
obj = pd.Series([10, np.nan, 20, 0, np.nan])
obj
obj.sort_values()
obj.sort_values(ascending=False)
obj.sort_values(na_position='first')<jupyter_output><empty_output><jupyter_text>DataFrame 정렬 * DataFrame.sort_index: index를 기준으로 정렬* DataFrame.sort_values: values를 기준으로 정렬<jupyter_code>frame = pd.DataFrame(np.arange(9).reshape(3,3), index = list('acb'), columns = list('edf'))
frame
frame.sort_index()
frame.sort_index(axis=1)
frame = pd.DataFrame({'a': [5, 4, 10, 10, 8], 'b': [2, 0, 3, 1, 4] })
frame
frame
frame.sort_values(by='a', ascending = False)
frame.sort_values(by=['a', 'b'], ascending = [False, True])<jupyter_output><empty_output><jupyter_text>함수 적용과 매핑 apply, applymap, map  Series<jupyter_code>series = pd.Series(np.arange(1, 4, 1)*100)
series
series.map('${}'.format)
series.map('{}달러'.format)
# lambda
f = lambda x: np.add(x, 3)
series.map(f)
series.map({100:'C', 200:'B', 300:'A'})
s = pd.Series([20, 21, 12], index=['London', 'New York', 'Helsinki'])
s
s
def sub_custom_value(x, val) :
    return x - val
s.apply(sub_custom_value, args=(10,))
def add_custom_values(x, **kwargs):
    for month in kwargs:
        x += kwargs[month]
    return x
s.apply(add_custom_values, june=30 , july=20, august=25)<jupyter_output><empty_output><jupyter_text>DataFrame<jupyter_code>frame = pd.DataFrame(np.arange(12).reshape(3, 4), dtype=int, columns = list('abcd'))
frame
frame
frame.apply(lambda x: x.max()-x.min())
frame.apply(lambda x: x.max()-x.min(), axis=1)
frame.applymap(lambda x: x**2)<jupyter_output><empty_output><jupyter_text>데이터 정제, 준비  데이터 삭제- drop<jupyter_code>frame = pd.DataFrame(np.arange(16).reshape(4,4), 
                         columns = ['c1', 'c2', 'c3', 'c4'],
                         index = ['r1', 'r2', 'r3','r4'])
frame
frame
frame.drop('r1')
frame.drop('c2', axis = 1)
frame.drop(columns=['c3', 'c4'])
# inplace
frame.drop(['r2'], inplace=True)
frame
# 할당 
frame = frame.drop(['r3'])
frame<jupyter_output><empty_output><jupyter_text>데이터 병합  concat<jupyter_code>s1 = pd.Series([100, 200], index=['c', 'b'])
s2 = pd.Series([300, 300, 300], index=['c', 'd', 'e'])
s3 = pd.Series([500, 600], index=['f', 'g'])
print(s1, s2, s3, sep='\n\n')
pd.concat([s1, s2, s3])
pd.concat([s1, s2], axis=1)
data1 = pd.DataFrame({'id': ['01', '02', '03', '04', '05', '06'], 'col1': np.random.randint(0, 50, 6), 'col2':np.random.randint(1000, 2000, 6)})
data2 = pd.DataFrame({'id': ['04', '05', '06', '07'], 'col1': np.random.randint(1000, 5000, 4)})
pd.concat([data1, data2])
pd.concat([data1, data2], axis=1)<jupyter_output><empty_output><jupyter_text>merge<jupyter_code>data1 = pd.DataFrame({'id': ['01', '02', '03', '04', '05', '06'], 'col1': np.random.randint(0, 50, 6), 'col2':np.random.randint(1000, 2000, 6)})
data1
data2 = pd.DataFrame({'id': ['04', '05', '06', '07'], 'col1': np.random.randint(1000, 5000, 4)})
data2
data1
data2
#inner join
pd.merge(data1, data2, on='id')  
#left join
pd.merge(data1, data2, on='id', how='left')  
# outer join
pd.merge(data1, data2, on='id', how='outer')
# key 다를 경우
data1 = pd.DataFrame({'lkey': ['a', 'b', 'c', 'd'], 'value': [1, 2, 3, 5]})
data2 = pd.DataFrame({'rkey': ['d', 'e', 'a', 'c'], 'value': [5, 6, 7, 8]})

pd.merge(data1, data2, left_on='lkey', right_on='rkey')<jupyter_output><empty_output><jupyter_text>missing data 처리 |함수|설명||---|---||isnull|누락되거나 NA(not available) 값을 알려주는 불리언 값들이 저장된 객체를 반환||notnull|isnull과 반대되는 메서드||fillna|누락된 데이터에 값을 채우는 메서드. (특정한 값이나 ffill, bfill 같은 보간 메서드 적용)||dropna|누락된 데이터가 있는 축(로우, 컬럼)을 제외시키는 메서드|<jupyter_code>obj = pd.Series(['apple', 'mango', np.nan, None, 'peach'])
obj
obj.isnull()
obj.notnull()
obj.dropna()
obj.fillna('-')
frame = pd.DataFrame([[np.nan, np.nan, np.nan, np.nan], [10, 5, 40, 6],
                      [5, 2, 30, 8], [20, np.nan, 20, 6], [15, 3, 10, np.nan]],
                     columns=['x1', 'x2', 'x3', 'y'])
frame
frame.dropna() 
# how
frame.dropna(how='all')
frame['e'] = np.nan
frame
# axis 
frame.dropna(axis=1, how='all')
frame
frame.fillna(0)
frame.fillna({'x1': 10, 'y':0})
frame
frame.fillna(method='bfill')
frame.fillna(method='ffill')<jupyter_output><empty_output><jupyter_text>데이터 변형  중복제거 - duplicated() : 각 로우가 중복인지(True) 아닌지(False) 알려주는 불리언 series 반환 - drop_duplicates(): duplicated 배열이 False인 dataframe 반환<jupyter_code>data = pd.DataFrame({'id':['0001', '0002', '0003', '0001'], 'name': ['a', 'b', 'c', 'a']})
data
data.duplicated()
data.drop_duplicates()
data['phone'] = range(4)
data
data.drop_duplicates(subset=['id'], keep='last')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.21757392473118278, 'fraction_numerical': 0.05241935483870968, 'mean_word_length': 5.332978723404255, 'pattern_counts': {'":': 0, '<': 45, '<?xml version=': 0, '>': 45, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '105693', 'license': 'Apache-2.0', 'n_tokens_mistral': 2972, 'n_tokens_neox': 3053, 'n_words': 531, 'path': 'python/practice/3-5_advanced_pandas.ipynb', 'repo_name': 'daludaluking/LG_AI_all_in_one-', 'size': '5952'}