일반적인 pandas 패턴과 이에 해당하는 DataStore 방식을 소개합니다. 대부분의 코드는 수정 없이 그대로 작동합니다!
데이터 로딩
CSV 읽기
# Pandas
import pandas as pd
df = pd.read_csv("data.csv")
# DataStore - 동일합니다!
from chdb import datastore as pd
df = pd.read_csv("data.csv")여러 파일 읽기
# Pandas
import glob
dfs = [pd.read_csv(f) for f in glob.glob("data/*.csv")]
df = pd.concat(dfs)
# DataStore - glob pattern을 사용하면 더 효율적
df = pd.read_csv("data/*.csv")필터링
하나의 조건
# Pandas와 DataStore - 동일
df[df['age'] > 25]
df[df['city'] == 'NYC']
df[df['name'].str.contains('John')]여러 조건
# AND
df[(df['age'] > 25) & (df['city'] == 'NYC')]
# OR
df[(df['age'] < 18) | (df['age'] > 65)]
# NOT
df[~(df['status'] == 'inactive')]query() 사용
# Pandas와 DataStore - 동일
df.query('age > 25 and city == "NYC"')
df.query('salary > 50000')isin()
# Pandas와 DataStore - 동일
df[df['city'].isin(['NYC', 'LA', 'SF'])]between()
# Pandas와 DataStore - 동일
df[df['age'].between(18, 65)]컬럼 선택
단일 컬럼
# Pandas와 DataStore - 동일
df['name']
df.name # 속성 접근여러 컬럼
# Pandas와 DataStore - 동일
df[['name', 'age', 'city']]선택 및 필터링
# Pandas와 DataStore - 동일
df[df['age'] > 25][['name', 'salary']]
# DataStore는 SQL 스타일도 지원
df.filter(df['age'] > 25).select('name', 'salary')정렬
단일 컬럼
# Pandas와 DataStore - 동일
df.sort_values('salary')
df.sort_values('salary', ascending=False)여러 컬럼
# Pandas와 DataStore - 동일
df.sort_values(['city', 'salary'], ascending=[True, False])상위/하위 N개 가져오기
# Pandas와 DataStore - 동일
df.nlargest(10, 'salary')
df.nsmallest(5, 'age')GroupBy 및 집계
기본 GroupBy
# Pandas와 DataStore - 동일
df.groupby('city')['salary'].mean()
df.groupby('city')['salary'].sum()
df.groupby('city').size() # 개수다중 집계
# Pandas와 DataStore - 동일
df.groupby('city')['salary'].agg(['sum', 'mean', 'count'])
df.groupby('city').agg({
'salary': ['sum', 'mean'],
'age': ['min', 'max']
})명명된 집계
# Pandas와 DataStore - 동일
df.groupby('city').agg(
total_salary=('salary', 'sum'),
avg_salary=('salary', 'mean'),
employee_count=('id', 'count')
)여러 GroupBy 키
# Pandas와 DataStore - 동일
df.groupby(['city', 'department'])['salary'].mean()데이터 조인하기
내부 조인
# Pandas
pd.merge(df1, df2, on='id')
# DataStore - 동일한 API
pd.merge(df1, df2, on='id')
# DataStore에서도 지원
df1.join(df2, on='id')LEFT JOIN
# Pandas와 DataStore - 동일
pd.merge(df1, df2, on='id', how='left')서로 다른 컬럼으로 조인
# Pandas와 DataStore - 동일
pd.merge(df1, df2, left_on='emp_id', right_on='id')Concat
# Pandas와 DataStore - 동일
pd.concat([df1, df2, df3])
pd.concat([df1, df2], axis=1)문자열 연산
대소문자 변환
# Pandas와 DataStore - 동일
df['name'].str.upper()
df['name'].str.lower()
df['name'].str.title()부분 문자열
# Pandas와 DataStore - 동일
df['name'].str[:3] # 처음 3개의 문자
df['name'].str.slice(0, 3)검색
# Pandas와 DataStore - 동일
df['name'].str.contains('John')
df['name'].str.startswith('A')
df['name'].str.endswith('son')치환
# Pandas와 DataStore - 동일
df['text'].str.replace('old', 'new')
df['text'].str.replace(r'\d+', '', regex=True) # 숫자 제거분리
# Pandas와 DataStore - 동일
df['name'].str.split(' ')
df['name'].str.split(' ', expand=True)길이
# Pandas와 DataStore - 동일
df['name'].str.len()DateTime 연산
날짜/시간 요소 추출
# Pandas와 DataStore - 동일
df['date'].dt.year
df['date'].dt.month
df['date'].dt.day
df['date'].dt.dayofweek
df['date'].dt.hour포맷팅
# Pandas와 DataStore - 동일
df['date'].dt.strftime('%Y-%m-%d')데이터 누락
결측값 확인
# Pandas와 DataStore - 동일
df['col'].isna()
df['col'].notna()
df.isna().sum()결측값 제거
# Pandas와 DataStore - 동일
df.dropna()
df.dropna(subset=['col1', 'col2'])누락값 채우기
# Pandas와 DataStore - 동일
df.fillna(0)
df.fillna({'col1': 0, 'col2': 'Unknown'})
df.fillna(method='ffill')새 컬럼 생성
단순 대입
# Pandas와 DataStore - 동일
df['total'] = df['price'] * df['quantity']
df['age_group'] = df['age'] // 10 * 10assign() 사용하기
# Pandas와 DataStore - 동일
df = df.assign(
total=df['price'] * df['quantity'],
is_adult=df['age'] >= 18
)조건식(where/mask)
# Pandas와 DataStore - 동일
df['status'] = df['age'].where(df['age'] >= 18, 'minor')사용자 지정 로직용 apply()
# 작동하지만 pandas 실행을 트리거함
df['category'] = df['amount'].apply(lambda x: 'high' if x > 1000 else 'low')
# DataStore 대안 (지연 실행 유지)
df['category'] = (
df.when(df['amount'] > 1000, 'high')
.otherwise('low')
)형태 변환
피벗 테이블
# Pandas와 DataStore - 동일
df.pivot_table(
values='amount',
index='region',
columns='product',
aggfunc='sum'
)Melt (언피벗)
# Pandas와 DataStore - 동일
df.melt(
id_vars=['name'],
value_vars=['score1', 'score2', 'score3'],
var_name='test',
value_name='score'
)확장
# Pandas와 DataStore - 동일
df.explode('tags') # 배열 컬럼 확장윈도우 함수
롤링
# Pandas와 DataStore - 동일
df['rolling_avg'] = df['price'].rolling(window=7).mean()
df['rolling_sum'] = df['amount'].rolling(window=30).sum()확장형
# Pandas와 DataStore - 동일
df['cumsum'] = df['amount'].expanding().sum()
df['cummax'] = df['amount'].expanding().max()Shift
# Pandas와 DataStore - 동일
df['prev_value'] = df['value'].shift(1) # 지연(Lag)
df['next_value'] = df['value'].shift(-1) # 선행(Lead)차이
# Pandas와 DataStore - 동일
df['change'] = df['value'].diff()
df['pct_change'] = df['value'].pct_change()출력
CSV로 출력
# Pandas와 DataStore - 동일
df.to_csv("output.csv", index=False)Parquet로
# Pandas와 DataStore - 동일
df.to_parquet("output.parquet")pandas DataFrame으로 변환
# DataStore 전용
pandas_df = ds.to_df()
pandas_df = ds.to_pandas()DataStore 추가 기능
SQL 보기
# DataStore 전용
print(ds.to_sql())실행 계획 설명
# DataStore 전용
ds.explain()ClickHouse 함수
# DataStore 전용 - 추가 Accessor
df['domain'] = df['url'].url.domain()
df['json_value'] = df['data'].json.get_string('key')
df['ip_valid'] = df['ip'].ip.is_ipv4_string()범용 URI
# DataStore 전용 - 어디서든 읽기 가능
ds = DataStore.uri("s3://bucket/data.parquet")
ds = DataStore.uri("mysql://user:pass@host/db/table")