Pandas: рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЬреБрд▓ре░ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pandas-dev/pandas

рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд┐рд╡рд░рдг

рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд╛рдпрдерди 3.7 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рдкрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .from_dataclasses рдпрд╛ рдХреЗрд╡рд▓ .DataFrame(data=dataclass_list) рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред .to_dataclasses рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░

from dataclasses import dataclass
import pandas as pd

<strong i="12">@dataclass</strong>
class SimpleDataObject(object):
  field_a: int
  field_b: str

dataclass_object1 = SimpleDataObject(1, 'a')
dataclass_object2 = SimpleDataObject(2, 'b')
>>> asd

# Dataclasses to DataFrame
df = pd.from_dataclasses([dataclass_object1, dataclass_object2])
df.dtypes == ['field_a', 'field_b']
>>> True
df.dtypes == ['int', 'str']
>>> True

# Dataclasses to DataFrame
df = pd.DataFrame(data=[dataclass_object1, dataclass_object2])
df.dtypes == ['field_a', 'field_b']
>>> True
df.dtypes == ['int', 'str']
>>> True

# DataFrame to Dataclasses
df = pd.DataFrame(columns=['field_a', 'field_b'], data=[[1, 'a'], [2, 'b']])
dataclass_list = df.to_dataclasses()
dataclass_list == [dataclass_object1, dataclass_object2]
>>> True
API Design Needs Discussion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

dataclasses рдореЙрдбреНрдпреВрд▓ рдореЗрдВ is_dataclass рдФрд░ fields рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рди рд╣реЛред

рдЙрд╕ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреАрдЖрдИ/рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрднреА рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ asdict рд╣реЗрд▓реНрдкрд░ рдирд┐рдЧрд▓рдирд╛ рдпреВрдЬрд╝рдХреЗрд╕ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

In [18]: from dataclasses import asdict

In [19]: pd.DataFrame([asdict(x) for x in [dataclass_object1, dataclass_object2]])
Out[19]:
   field_a field_b
0        1       a
1        2       b

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

AFAIK рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИрдВред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ:

<strong i="7">@dataclass</strong>
class SimpleDataObject(object):
  field_a: int
  field_b: str

x = SimpleDataObject(a=2, b=тАШfтАЩ)

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рд╕реЗ рднреА рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ x рдПрдХ рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╣реИ, рд╣реИ рдирд╛? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

dataclasses рдореЙрдбреНрдпреВрд▓ рдореЗрдВ is_dataclass рдФрд░ fields рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рди рд╣реЛред

рдЙрд╕ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреАрдЖрдИ/рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрднреА рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ asdict рд╣реЗрд▓реНрдкрд░ рдирд┐рдЧрд▓рдирд╛ рдпреВрдЬрд╝рдХреЗрд╕ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

In [18]: from dataclasses import asdict

In [19]: pd.DataFrame([asdict(x) for x in [dataclass_object1, dataclass_object2]])
Out[19]:
   field_a field_b
0        1       a
1        2       b

рдореИрдВрдиреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдореИрдВ рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ __init__ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рдкрд░реАрдХреНрд╖рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрдХрд╛рдзрд┐рдХ py-рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Abrosimov-a-a picture Abrosimov-a-a  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mfmain picture mfmain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ericdf picture ericdf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amelio-vazquez-reina picture amelio-vazquez-reina  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tade0726 picture tade0726  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ