์ด๋ฐ ์ผ์ ํ ์ ์์ผ๋ฉด ์ข์ ํ ๋ฐ.
df.query('[col with space] < col')
์ด ์ด๋ฆ์ ๊ณต๋ฐฑ์ด ์๋ ๋ง์ ์ธ๋ถ ๋ฐ์ดํฐ ํ์ผ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด ์ด๋ฆ์ ๋จผ์ ๋ฐ๊พธ์ง ์๊ณ ๋ฐ์ดํฐ์ ๋ํ ๋น ๋ฅธ ๋ถ์์ ์ํํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
ํ . ๋ง์ ๋ฐ์ดํฐ ์ธํธ์ ์ด ๋ฌธ์ ๊ฐ ์์ง๋ง ์ด ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋ฐ ํ์ํ ์ฝ๋ ์๊ณผ ์ ๊ตฌ๋ฌธ(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ํ์ํ ์ฝ๋ ์์ ๊ณ ๋ คํ์ญ์์ค.
์ด ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค.
cols = df.columns
cols = cols.map(lambda x: x.replace(' ', '_') if isinstance(x, (str, unicode)) else x)
df.columns = cols
์ด๊ฒ์ ์ ํ ์คํธ๋์์ผ๋ฉฐ ๋๋ฒ๊ทธํ๊ธฐ ์ฝ์ต๋๋ค. ๋ ๋ณต์กํ ๊ต์ฒด์ ๊ฒฝ์ฐ ์ ๊ท์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ตฌ๋ฌธ ๋ถ์์ ๋ค์ด๊ฐ๋ ๊ฒ์ ํจ์ฌ ๋ ๊ฐ๋จํฉ๋๋ค.
ColumnNode
๋๋ ํ๋ ์์์ ์ด๋ก ์กฐํ๋๋ ์ผ๋ถ ๊ฐ์ฒด๋ก ๊ตฌ๋ฌธ ๋ถ์)ํ๋ณตํ ๋งค์ฒด๋ก ์ ์ฉํ ์ ์๋ ๊ฒ์ ์ด ์ด๋ฆ์ ์ ํจํ Python ์๋ณ์๋ก ๋ฐ๊พธ๋ df = pd.clean_columns(df)
ํจ์์ด๋ฏ๋ก ๋๋ฌด ์ด๋ ต๊ฒ ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค.
๊ตฌํ์ ๋ํด ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ๋ฐ ๋๊ดํธ๋ฅผ ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
df.query('(col with space) < col')
์ด์จ๋ , clean_columns
๋ฐฉ๋ฒ์ ๋์๊ฒ ์ข์ ์๊ฐ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. read_csv
ํจ์์ ํค์๋ ์ธ์์ผ ์๋ ์์ต๋๋ค.
@socheon ์ฐ๋ฆฌ์ ๋
ผ์๋ฅผ ํ๋์ ๋ฌธ์ ๋ก ์ ์งํ๋ ค๊ณ ๋
ธ๋ ฅํฉ์๋ค(์ ๋ ์ฃผ์ ์์ ๋ฒ์ด๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค!). read_csv
clean_columns
์ธ์๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์ธ์.
@jreback ์ต์์ clean_columns
ํจ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
์ด ์ด๋ฆ ์ฃผ์์ ๋ฐ์ดํ๋ฅผ ๋ฃ์ผ๋ฉด ๋ง์คํฐ์์ ์๋ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
& ๋ฐ | ์ด๋ฅผ ๋จ์ผ ํ ํฐ์ฒ๋ผ ์ทจ๊ธํฉ๋๋ค.
๋ฌธ์์ด๋ก ์ฒ๋ฆฌ๋ ๋ค์ ๋ด๋ถ ์์๋ก ๋ฐ๋๋ฏ๋ก ์๋ํ์ง ์์ต๋๋ค.
df.query("'a column with a space' > 2") -> df.query("tmp_var_str_some_hex_value > 2")
์ด์ด ๊นจ๋ํ ๋ฒ์ ์์ ์ฐธ์กฐ๋๋๋ก ํ์ฉํ ์ ์์ต๋๊น?
df.query("column_with_space > 2")
์๋ฏธ๊ฐ ์์ ๋๋ง๋ค ์๋ ์์ฑ์ ์ํด ์ด ์ ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
๊ณต๋ฐฑ, ์ , ๋๊ดํธ ๋ฐ ๊ธฐํ ์ ํจํ์ง ์์ ๋ฌธ์๊ฐ ์๋ ์ด ์ด๋ฆ์ ์ ํ์ ์ผ๋ก ๋ฐ์ค๊ณผ ๊ฐ์ ๋๋ฑํ ์ ํจํ ๋ฌธ์๋ก ์๋ ๋์ฒด๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋ํธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ํ๋ ์์ ๊ตฌ์ฑ์์ผ๋ก ์ด์ ์ก์ธ์คํ๋ ๋ฐ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค.
์๋
ํ์ธ์,
์ด ๋ฌธ์ ์ ํด๊ฒฐ์ ์ํด ์์ฝ์ ํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋งค์ฐ ์ค์ํ ๋ฌธ์ ์ ๋๋ค. ์ด ์ด๋ฆ์ ๋ณด์กดํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
ํฌ๋๊ฐ ์ด ์ด๋ฆ์ ์์์ ์๊ตฌ ์ฌํญ์ ์ ์ฉํ๋ค๋ ๊ฒ์ IMHO, ์๋ชป๋ ์ค๊ณ ๊ฒฐ์ ๋ฐ ์๋ชป๋ ํ๋ก๊ทธ๋๋ฐ ๊ดํ์ ๋๋ค.
๋ถํํด์ ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ํ๋ค๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ ๋๋ก ํด๊ฒฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๊ฐ์ฌํฉ๋๋ค.
@dgua ์์ ์ ์ํด ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค. ์ค์ ๋ก .query
๋ ์ฌ์ฉํ๊ธฐ ์ข์ ์ธํฐํ์ด์ค์
๋๋ค. ์ฌ์ค ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๋ณด์ฅ์ด ์์ต๋๋ค. ์ฆ, ์์ ํ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค๊ฐ ์๋๋ผ ์ฟผ๋ฆฌ ์ธ์ด์ฒ๋ผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค.
์ด์จ๋ ๊ถ์ฅ๋๋ ์ธ๋ฑ์ฑ์ '์ฃผ์' ๋ฐฉ๋ฒ์ ํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
In [10]: df = DataFrame({'foo bar': [1, 2, 3, 4]})
In [11]: df[df['foo bar'] > 2]
Out[11]:
foo bar
2 3
3 4
jreback, ๋๋ ๋น์ ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ฝ๊ณ /๋ ์ฝ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์ฝ๋์์ .query
๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ์์ต๋๋ค. ๊ทธ๋์ ์ด์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ด ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๋์ ์ ์ฒํด ์์ต๋๋ค. ๋ ๋ค ๋ฐ๋์งํ์ง ์์ต๋๋ค.. .
@dgua ๋ด๊ฐ ๋งํ๋ฏ์ด ์ปค๋ฎค๋ํฐ์ ํ ์์ฒญ์ด ์๋ฃ๋ฉ๋๋ค. ์๊ฐ์ด ์์ด์.
R๊ณผ dplyr๋ backtick( `` )์ ์ฌ์ฉํ์ฌ ๊ณต๋ฐฑ๊ณผ ํน์ ๋ฌธ์๋ก ์ด ์ด๋ฆ์ ์ธ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
df$`column with space`
df %>%
mutate(`column with space` = 1)
query
, eval
๋๋ df.
๋ํธ ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ ํจ์๊ฐ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ด ์ด๋ฆ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ด๊ฒ์ pandas ํ์์ ํตํฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ๊ถ๊ธํฉ๋๋ค.
๋๋ zhiruiwang์ ์ ์๊ณผ ๋ค๋ฅธ ์ฌ๋๋ค์ด ํ๋ ๊ทธ์ upvotes๋ฅผ ๋ณด๊ณ ์ข์ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ ์ฝ๋๋ฅผ ์กฐ๊ธ ์ดํด๋ณด์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก pandas๋ ํํ์์ ๋ํด ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ณ ์ด๋ฅผ numexpr์ ์ ๋ฌํฉ๋๋ค. ๊ทธ ์์ ๋ฐ์ดํฐ ํ๋ ์ ์ด์ ์ด๋ฆ์ ํฌํจํ๋ localdict๊ฐ ํจ๊ป ์ ๋ฌ๋ฉ๋๋ค.
์ญ๋ฐ์ดํ ์์ ๋ชจ๋ ๊ณต๋ฐฑ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก(์: "_" ๋๋ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ ์ฌ์ฉ๋๋ ๊ฒ)์ผ๋ก ๋ฐ๊พธ์ด ํํ์ ๋ณ๊ฒฝํ๊ณ ์ญ๋ฐ์ดํ๋ฅผ ์ ๊ฑฐํ๋ ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด๊ฒ์ numexpr์ ๋ํ ์ ํจํ ํํ์์ ์์ฑํฉ๋๋ค. ๊ทธ ์์ ์ด ์ด๋ฆ์ ๊ณต๋ฐฑ์ด ๊ฒฐ๊ตญ localdict๋ฅผ ๊ตฌ์ฑํ๋ ํ์ธ์์ ์ ๋ฌ๋ ๋ ๋์ผํ ์์ ์ ์ํํ์ฌ numexpr์์ ์ฌ์ ํ ์ฌ๋ฐ๋ฅธ ์ด๋ฆ์ ์ฐพ์ ์ ์๋๋ก ํฉ๋๋ค.
์ด ์์ ์ ์ํํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ง๋ง ํ ์คํธํ์ง๋ ์์์ต๋๋ค. ๋๋ ๋จผ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ทธ ์์ด๋์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๋ฃ๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
# Don't know if "_" is a good choice and don't know where to place this variable,
# since it has to be constant in two different files and ideally is only defined once.
SEPERATOR_REPLACING_SPACES = "_"
# Replace spaces in variables surrounded by backticks:
# pandas/pandas/core/computation/expr.py
import re
...
# new function
def _replace_spaces_backtickvariables(source):
return re.sub(r'`(.*?)`',
lambda m: m.group(1).replace(" ", SEPERATOR_REPLACING_SPACES),
source)
...
# adjusted function
def _preparse(source, f=compose(_replace_locals, _replace_booleans,
_rewrite_assign), g=lambda x: x):
...
g : callable
This takes a source string and returns an altered one
...
assert callable(g), 'g must be callable'
source = g(source)
...
# adjusted class
class PandasExprVisitor(BaseExprVisitor):
def __init__(self, env, engine, parser,
preparser=partial(_preparse,
f=compose(_replace_locals, _replace_booleans)
g=_replace_spaces_backtickvariables)):
# Replace spaces in column names when passed to the localdict:
# pandas/pandas/core/frame.py
# adjusted function
def eval(self, expr, inplace=False, **kwargs):
...
# line 3076
resolvers = dict((k.replace(" ", SEPERATOR_REPLACING_SPACES), v)
for k, v in self.iteritems()), index_resolvers
ํธ์ง: _replace_spaces_backtickvariables
(์ ๊ท์์ ๊ฒ์ผ๋ฅธ ์ํ์ฌ์ผ ํจ)
@zhiruiwang df.
๊ตฌ๋ฌธ์ Python์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์๋๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง query
๋ฐ eval
๋ ์๋ํฉ๋๋ค.
@jreback ์ด ๋ถ๋ถ์ ๋ํด ๊ฐ์ฅ ์ ์๊ณ
์ด์ ๋๊ธ์์ ์ค๋ช ํ ๋ด ์ ๊ทผ ๋ฐฉ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
๋์ ์ฐ๋ฆฌ๋ ๋ฌ๋ ์ด ์ ์ํ ๋๋ก ํด๊ฒฐํ๊ธฐ๋ก ๊ฒฐ์ ํ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ "๋ํฐ" ์ด๋ฆ์ด "๊นจ๋ํ" ์ด๋ฆ์ผ๋ก ์ฐธ์กฐ๋๋๋ก ํ์ฉํ๊ณ ("์ด ์ด ์ด๋ฆ"์ ์ด์ด ์ค์ ๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ์ง ์๊ณ "this_column_name"์ผ๋ก ์ฐธ์กฐํ ์ ์์) `` ์บก์ํ๋ฅผ ์ ํ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ด ํ ์ค๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค. (์ฝ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ํ ์คํธํ์ง ์์์ต๋๋ค.)
# Replace spaces in column names when passed to the localdict:
# pandas/pandas/core/frame.py
# adjusted function
def eval(self, expr, inplace=False, **kwargs):
...
# line 3076
resolvers = dict((k.replace(" ", SEPERATOR_REPLACING_SPACES), v)
for k, v in self.iteritems()), index_resolvers
์ด๋ป๊ฒ ์๊ฐํด? ์ด๋ค ์ ๊ทผ ๋ฐฉ์์ด ๊ฐ์ฅ ์ข๋ค๊ณ ์๊ฐํฉ๋๊น?
๋ด๊ฐ ๊ทธ๊ฒ์ ์ํด ํ ๋ฆฌํ์คํธ๋ฅผ ์๋ํ ์ ์๋ ๊ฒ๋ณด๋ค.
์ด ๊ธฐ๋ฅ์ ์ข์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
df.rename(columns={k: k.replace(' ','_') for k in df.columns if k.count(' ')>0}, inplace=1)
df.rename(columns={k: '_'+k for k in df.columns if k[0].isdigit()}, inplace=1)
์ฃ์กํ์ง๋ง, ๋ง์กฑ์ค๋ฝ์ง ์์ต๋๋ค. ์๋ ์ด๋ก ๋์๊ฐ๋ ค๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น? '_'๊ฐ ์ด ์ด๋ฆ์ ์ผ๋ถ๋ก๋ ์ฌ์ฉ๋๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
์ฌ์ฉ์๋ ์ด๊ฒ์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ํฌ๋์ ์ฌ๊ฐํ ๋ฌธ์ ์ ๋๋ค.
DG
2019๋ 1์ 19์ผ 11:49์ bscully27 [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ข์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
๊ณต๋ฐฑ ๋ฐ๊พธ๊ธฐ
df.rename(columns={k: k.replace(' ','_') for k in df.columns if k.count(' ')>0}, inplace=1)
์ซ์ ๊ฐ์ผ๋ก ์์
df.rename(columns={k: '_'+k for k in df.columns if k[0].isdigit()}, inplace=1)
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/pandas-dev/pandas/issues/6508#issuecomment-455809809 ์์ ํ์ธํ๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐ
SQL์์๋ ๋๊ดํธ๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
@dgua PR์ ์ ์ถํ ์๊ฐ์ด ์์ต๋๊น? @zhiruiwang ์ ๋ฐฑํฑ ์ฌ์ฉ ์ ์์ ๊ตฌํ๋ ์ ์๋ค๋ฉด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค(์ด๋ฏธ Python 2์์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์๋ ์ฌ์ฉํ ์ ์์์ต๋๋ค).
@TomAugspurger ์ํ์ด ๋๋ ํ ์๊ฐ์ด ์๊ณ ์ด๋ฏธ ๊ตฌํ ์ฝ๋๋ฅผ ์ดํด๋ณด์์ต๋๋ค(์ด์ ์๊ฒฌ ์ฐธ์กฐ). ์์ง ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
SEPERATOR_REPLACING_SPACES
์(๋) ๋ฌด์์ด์ด์ผ ํฉ๋๊น? ์ฐ๋ฆฌ๊ฐ ์ ํํ๋ ๊ฒฝ์ฐ "_"์ฐ๋ฆฌ๊ฐ ์ ํํ๋ ๊ฒฝ์ฐ, ๋์ ์ข ๋ ๋ณต์กํ ๋์ฒด ๋ฌธ์์ด, ๊ทธ๊ฒ์ ๋น์ ์ด ์ฐธ์กฐ ํ ์์๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ด "_"์ด๋ฏธ ์กด์ฌํ๋ ๋ค๋ฅธ ์ด์ ๋ฐฉํดํ์ง๋ง, ์ this column name
๋ก `this column name`
_๋ฐ_ this_column_name
. (๋ฐฑํฑ ๊ธฐ๋ฅ์ ์ญ์ ํ ์๋ ์์ต๋๋ค.)
SEPERATOR_REPLACING_SPACES
๋ ๋ ํ์ผ์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ด ์์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ณณ์์ ์ ์ธํ๊ณ ์ด ํ์ผ๋ก ๊ฐ์ ธ์์ ๋์ผํ์ง ํ์ธํด์ผ ํฉ๋๊น, ์๋๋ฉด ๊ฐ๋จํ ์ธ๊ธํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๊น?
๋ด๊ฐ ๋ณ๊ฒฝํ ์ฝ๋์์๋ callable()
๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. callable()
๋ 3.0-3.2์์ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด๊ฒ๋ ๋์์ ๊ณ ์ณ์ผ ํ๋์?
์ด ์ฝ๋์ ์ต์ํ์ง ์์ผ๋ฏ๋ก ์ฌ๊ธฐ ์ ๋ฌธ๊ฐ์ผ ์ ์์ต๋๋ค. :)
๋ด๊ฐ ๋ณ๊ฒฝํ ์ฝ๋์์๋ callable()์ด ์ฌ์ฉ๋ฉ๋๋ค. callable()์ 3.0-3.2์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ด์ฌ 3.0 - 3.2? 3.5 ์ด์์ด ํ์ํฉ๋๋ค.
eval
๋๋ query
์ปจํ
์คํธ์์ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐฑํฑ ์์ด๋์ด๊ฐ ์คํ๋ ค ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋จ์ด ๋จ๋ฆฌ๊ณ ์ถ์ง ์์ ๊ฒ์
๋๋ค.
์ผ๋ฐ Python ์ปจํ ์คํธ์ ๊ฒฝ์ฐ ์ ์ด๋ฆ์๋ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๋์ฌ ๋๋ ์ ๋ฏธ์ฌ๊ฐ ์์ ์ ์์ต๋๋ค(์: ๋ชจ๋ ๋ฐ์ค๋ก ๋๋จ).
์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๋์ฌ ๋๋ ์ ๋ฏธ์ฌ๊ฐ ์์ต๋๋ค.
@beojan ์, ํ์ง๋ง ์ด๋ฌํ "์ถฉ๋"์ ๊ธฐ๋ฅ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ `this column name`
_and_ this_column_name
๋ก this column name
๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ๋ํ this column name
๋ฐ this_column_name
๋ ๊ฐ์ ์ด ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ ์ฝ๊ฐ ์ด๋ฆฌ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ฒฐ์ฝ ์ ์ ์์ต๋๋ค.
this_column_name_
์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์ ๋ก ๋ ๊ฐ์ ์ถฉ๋ํ๋ ์ด์ด ์๋ค๋ฉด ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๊ธฐ๋ฅ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ธ์, ๋ด๊ฐ ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ์ง๊ณ ์๋ค๋ฉด :
"column name" "name"
1 4 5
2 2 1
์ถฉ๋์ ๋ํ ์กฐ์น ์์ด ๊ตฌํ๋ ๊ธฐ๋ฅ์ผ๋ก ์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ์ ์์ต๋๋ค.
df.query(column_name > 3)
๊ทธ๋ฆฌ๊ณ pandas๋ ์ด ์ฟผ๋ฆฌ์์ ์๋์ผ๋ก "์ด ์ด๋ฆ"์ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ ์์ ๋ฌ์ ์ด๋ ์ ์ํ ๋ฐ ์๋ค. ์ด์ ๋ฐฑํฑ์ ๋ํ ์ง์์ ์๋ตํ ์๋ ์์ต๋๋ค.
๋๋ ๋ํ ๋น์ ์ด _์ผ์์์_ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ณผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
"column name" "name" "column_name"
1 3 5 6
2 2 1 9
์ถฉ๋๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ ์๊ฐ์๋ ์ถฉ๋์ ์ผ์ผํค์ง ์๊ณ ์ด์ ์ฐธ์กฐํ๋ ์ถ๊ฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ถ๋ถ์ ์ผ๋ก ์ง์ํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ํฌ์ธํธ
PR์ ๋ชจํธ์ฑ์ ์์ ํ ํผํ๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ๋ง์ง๋ง ์์ ๊ฐ ์๋ํด์ผ ํฉ๋๋ค.
2019๋ 1์ 23์ผ ์์์ผ ์ค์ 10์ 56๋ถ์ hwalinga [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ธ์, ๋ด๊ฐ ๋ฐ์ดํฐ ํ๋ ์์ ๊ฐ์ง๊ณ ์๋ค๋ฉด :
"column name" "name"
1 4 5
2 2 1๊ตฌํ๋ ๊ธฐ๋ฅ์ผ๋ก ์ถฉ๋์ ๋ํ ์กฐ์น ์์ด ์ด์ ํ ์ ์์ต๋๋ค.
๋งํ๋ค:df.query(column_name > 3)
๊ทธ๋ฆฌ๊ณ pandas๋ ์ด ์ฟผ๋ฆฌ์์ ์๋์ผ๋ก "์ด ์ด๋ฆ"์ ์ฐธ์กฐํฉ๋๋ค. ์ด๊ฒ
dalejung๋ ์์ ์ ์ํ์ต๋๋ค. ์ด์ ์ง์์ ๋ ๋ ์๋ ์์ต๋๋ค.
๋ฐฑํฑ ์์์ ์ํด.๋๋ ๋ํ ๋น์ ์ด ์ผ์ ์์ ๋ณด์ด๋ ๋ฐ์ดํฐ ํ๋ ์
์ฒ๋ผ:"column name" "name" "column_name"
1 3 5 6
2 2 1 9์ถฉ๋๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ ์๊ฐ์๋ ์ถฉ๋์ ์ผ์ผํค์ง ์๊ณ ์ถ๊ฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ด์ ์ฐธ์กฐํ์ญ์์ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/pandas-dev/pandas/issues/6508#issuecomment-456880863 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABQHIkl6f9IgUGBKlzranZpsOe3atH3Aks5vGJQ7gaJpZM4Bl2In
.
@TomAugspurger ์๊ฒ ์ต๋๋ค.
์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด "_"์ ๊ฐ์ ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ด ์ด๋ฆ ์ฌ์ด์ ๊ณต๋ฐฑ์ ๋ณต์กํ ๋ฌธ์์ด๋ก ๊ต์ฒดํ์ฌ ๋ ๋ง์ ์ฐ๋ฐ์ ์ถฉ๋์ ๋ฐฐ์ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ AST์์ ์ง์ ์๋ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ๋ค์ด ์ค์ ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ๋ฌธ ๋ถ์๋์ง๋ง ์ฌ์กฐ๋ฆฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
์ด ๊ธฐ๋ฅ์ด ์ถ์๋๋ ์ผ์ ์ด ์์ต๋๊น?
์์์ ์ธ๊ธ ํ ์ปค๋ฐ์ ๊ฐ์ํ ๋ ๋ง์คํฐ์์ ์ํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ 0.25์ ์์ ๊ฒ์ ๋๋ค - 1~2๊ฐ์ ํ
์ฌ๋ฏธ๋ฅผ ๋ง์น๊ณ ์ถ์ง๋ ์์ง๋ง ์ค๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด: Pandas 0.25๋ Python3์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. https://pandas-docs.github.io/pandas-docs-travis/install.html#install -dropping-27๋ ์ฐธ์กฐ
@jreback ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. 0.25.0 ์ด์ ํ๊ฐ 5์ 1์ผ์ ๋ง๊ฐ๋๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
@hwalinga ๊ฑฑ์ ๋ง์ธ์. ์ด๊ฒ์ Python3 ์ ์ฉ ์ฝ๋๋ฒ ์ด์ค์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ ์ด ํฌํจ๋ ์ด ์ด๋ฆ์ ํ์ฉํ ์ ์๋ ์ข์ ๊ธฐํ์์ ๊ฒ์ ๋๋ค. ์ ์ด๊ฒ์ด ํฌํจ๋์ง ์์์ต๋๊น?
@danielhrisca
๋๋ ์ด๊ฒ์ ๊ตฌํํ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ์ง ์์์ต๋๋ค. ์ ๋ฌธ์ ๋ฅผ ์ด์ด ๋ค์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๋ด๊ฐ ์์ง ๋ชปํ๋ ํฉ๋นํ ์ด์ ๊ฐ ์์ ์ ์์ง๋ง ์ ์ง ๊ด๋ฆฌ์๋ ์ด๊ฒ์ด ํ์ฉ๋์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋ค์ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ์์. ๊ทธ๋ฌ๋ ๊ณต๊ฐ๊ณผ ๋์ผํ ์๋ฃจ์ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ํ์ด์ฌ ์์ค ์ฝ๋๋ก ํ์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํน์ ๊ตฌ๋ฌธ์ ๋ค๋ฅด๊ฒ ํด์ํ๋ ค๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ด ํจ์์ ๋ํ ์ฌ์ฉ์ ์ ์ ํ์๋ ๊ตฌํ๋์ง ์์ ๊ฒ์ ๋๋ค.
@hwalinga HI
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ๋๋ ํ
์ด๋ธ ์ด๋ฆ์ด ํฌ์ธํธ์
๋๋ค
snv_df.query('Gene.refGene in ["MSH2","MSH3","MLH1","MLH3","MSH6","PMS2","PMS3"]'
0.25.0์์ ๋ณ๊ฒฝํ ์ฌํญ์ ํ์ธํ์ต๋๋ค.
์ ์์ด ์์ด์๏ผ
perl ์ํํธ์จ์ด novar์ ์์ค ์ฝ๋๋ฅผ ์ฝ์์ ๋ 16์ง์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ธฐํธ๋ฅผ ๋ํ๋ผ ์ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
fg
comsic=comsic\x3dxxxxxxxxxxxxxxxxxxx
๊ตฌ๋ฌธ ๋ถ์ ์ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ํน์ ๊ธฐํธ์ ํด๋นํ๋ ํจ์ ์ฌ์ฉ
@zhaohongqiangsoliva
๋๋ ๋น์ ์ด ๋งํ๋ ค๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ๋ํด ์ข ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@hwalinga
์ฃ์กํฉ๋๋ค, ์ ์์ด๊ฐ ์ข์ง ์์ต๋๋ค. ๋ด ๋ฌธ์ ๋ ์ด ์ด๋ฆ ์ฌ์ด์ ๊ณต๋ฐฑ ๋ฌธ์ ๊ฐ ์ด์ ํด๊ฒฐ๋์์ง๋ง ๋ค๋ฅธ ๊ธฐํธ๋ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด
. / \
์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ Hex๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ ๋ฒ์งธ. ์ด ์ด๋ฆ์๋ ๋ชจ๋ ๋ฌธ์๊ฐ ํ์ฉ๋์ด์ผ ํฉ๋๋ค.
๊ฐ์ฌ ํด์.
2019๋ 6์ 22์ผ 18:01์ zhaohongqiangsoliva [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@hwalinga https://github.com/hwalinga
์ฃ์กํฉ๋๋ค, ์ ์์ด๊ฐ ์ข์ง ์์ต๋๋ค. ๋ด ๋ฌธ์ ๋ ์ด ์ด๋ฆ ์ฌ์ด์ ๊ณต๋ฐฑ ๋ฌธ์ ๊ฐ ์ด์ ํด๊ฒฐ๋์์ง๋ง ๋ค๋ฅธ ๊ธฐํธ๋ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด. / \
์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ Hex๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ง์ ์ด ์ด๋ฉ์ผ์ ํ์ ๋ณผ์ GitHub์์ https://github.com/pandas-dev/pandas/issues/6508?email_source=notifications&email_token=AA5U7NAIAJXVHI7LYXNCGNDP33DO5A5CNFSM4AMXMIT2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODYKUG3I#issuecomment-504709997 , ๋๋ ์ค๋ ๋ ์์๊ฑฐ https://github.com/์ ์๋ฆผ/๊ตฌ๋ ์ทจ์-์ธ์ฆ/AA5U7NCACMBXVVQT7Z4DUE3P33DO5ANCNFSM4AMXMITQ .
@dgua @zhaohongqiangsoliva
๋ฌธ์ ๋ ์ฟผ๋ฆฌ๊ฐ ์ ํจํ Python ํํ์์ด ๋์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ํ์ฉ๋์ง ์๋ ๋ฌธ์์ 16์ง์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์ด๋ฆ์ ๊ณต๋ฐฑ์ ํ์ฉํ๋ ๊ฒ์ ์ด๋ฏธ ํ ํฐํ ๊ธฐ๋ฅ( from tokenize import generate_tokens
)์ ๋ํ ํดํน์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ฆ์ ๋ ๋ง์ ๋ฌธ์๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง๋ ์์ง๋ง ๋ค์ ํ ํฐํ ๊ธฐ๋ฅ์ ํดํนํ๋ ๊ธฐ๋ฐ์ด ๋ ๊ฒ์
๋๋ค. (Pandas๋ ์์ฒด Python ํ์ ์ญํ ์ ํ์ง ์์ต๋๋ค.)
๋น์ ์ด ์ด๊ฒ์ ์ ๋ง๋ก ์ํ๋ค๋ฉด, ๋น์ ์ ์ด ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๋ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์์ ๋กญ๊ฒ ์ด ์ ์์ผ๋ฉฐ, ๋น์ ์ด ๋ฌธ์ ์ ๋๋ฅผ ํ๊ทธํ๋ฉด ๋๋ ์ ์ง ๊ด๋ฆฌ์์๊ฒ ๋ด ์๋ฃจ์ ์ ์ค๋ช ํ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
R๊ณผ dplyr๋ backtick( `` )์ ์ฌ์ฉํ์ฌ ๊ณต๋ฐฑ๊ณผ ํน์ ๋ฌธ์๋ก ์ด ์ด๋ฆ์ ์ธ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
query
,eval
๋๋df.
๋ํธ ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ ํจ์๊ฐ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ด ์ด๋ฆ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ด๊ฒ์ pandas ํ์์ ํตํฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ๊ถ๊ธํฉ๋๋ค.