[jira] [Commented] (ARROW-5480) [Python] Pandas categorical type doesn't survive a round-trip through parquet
[ https://issues.apache.org/jira/browse/ARROW-5480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16856967#comment-16856967 ] Joris Van den Bossche commented on ARROW-5480: -- [~wesmckinn] I think this can be closed as duplicate of the other issue? > [Python] Pandas categorical type doesn't survive a round-trip through parquet > - > > Key: ARROW-5480 > URL: https://issues.apache.org/jira/browse/ARROW-5480 > Project: Apache Arrow > Issue Type: Improvement > Components: Python >Affects Versions: 0.11.1, 0.13.0 > Environment: python: 3.7.3.final.0 > python-bits: 64 > OS: Linux > OS-release: 5.0.0-15-generic > machine: x86_64 > processor: x86_64 > byteorder: little > pandas: 0.24.2 > numpy: 1.16.4 > pyarrow: 0.13.0 >Reporter: Karl Dunkle Werner >Priority: Minor > > Writing a string categorical variable to from pandas parquet is read back as > string (object dtype). I expected it to be read as category. > The same thing happens if the category is numeric -- a numeric category is > read back as int64. > In the code below, I tried out an in-memory arrow Table, which successfully > translates categories back to pandas. However, when I write to a parquet > file, it's not. > In the scheme of things, this isn't a big deal, but it's a small surprise. > {code:python} > import pandas as pd > import pyarrow as pa > df = pd.DataFrame({'x': pd.Categorical(['a', 'a', 'b', 'b'])}) > df.dtypes # category > # This works: > pa.Table.from_pandas(df).to_pandas().dtypes # category > df.to_parquet("categories.parquet") > # This reads back object, but I expected category > pd.read_parquet("categories.parquet").dtypes # object > # Numeric categories have the same issue: > df_num = pd.DataFrame({'x': pd.Categorical([1, 1, 2, 2])}) > df_num.dtypes # category > pa.Table.from_pandas(df_num).to_pandas().dtypes # category > df_num.to_parquet("categories_num.parquet") > # This reads back int64, but I expected category > pd.read_parquet("categories_num.parquet").dtypes # int64 > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (ARROW-5480) [Python] Pandas categorical type doesn't survive a round-trip through parquet
[ https://issues.apache.org/jira/browse/ARROW-5480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16856970#comment-16856970 ] Wes McKinney commented on ARROW-5480: - I'm not sure -- I think the scope of work in ARROW-3246 may be slightly different. I'd like to look at the Parquet-Categorical stuff sometime this month so I can look at both issues more closely then > [Python] Pandas categorical type doesn't survive a round-trip through parquet > - > > Key: ARROW-5480 > URL: https://issues.apache.org/jira/browse/ARROW-5480 > Project: Apache Arrow > Issue Type: Improvement > Components: Python >Affects Versions: 0.11.1, 0.13.0 > Environment: python: 3.7.3.final.0 > python-bits: 64 > OS: Linux > OS-release: 5.0.0-15-generic > machine: x86_64 > processor: x86_64 > byteorder: little > pandas: 0.24.2 > numpy: 1.16.4 > pyarrow: 0.13.0 >Reporter: Karl Dunkle Werner >Priority: Minor > > Writing a string categorical variable to from pandas parquet is read back as > string (object dtype). I expected it to be read as category. > The same thing happens if the category is numeric -- a numeric category is > read back as int64. > In the code below, I tried out an in-memory arrow Table, which successfully > translates categories back to pandas. However, when I write to a parquet > file, it's not. > In the scheme of things, this isn't a big deal, but it's a small surprise. > {code:python} > import pandas as pd > import pyarrow as pa > df = pd.DataFrame({'x': pd.Categorical(['a', 'a', 'b', 'b'])}) > df.dtypes # category > # This works: > pa.Table.from_pandas(df).to_pandas().dtypes # category > df.to_parquet("categories.parquet") > # This reads back object, but I expected category > pd.read_parquet("categories.parquet").dtypes # object > # Numeric categories have the same issue: > df_num = pd.DataFrame({'x': pd.Categorical([1, 1, 2, 2])}) > df_num.dtypes # category > pa.Table.from_pandas(df_num).to_pandas().dtypes # category > df_num.to_parquet("categories_num.parquet") > # This reads back int64, but I expected category > pd.read_parquet("categories_num.parquet").dtypes # int64 > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)
[jira] [Commented] (ARROW-5480) [Python] Pandas categorical type doesn't survive a round-trip through parquet
[ https://issues.apache.org/jira/browse/ARROW-5480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16898482#comment-16898482 ] Wes McKinney commented on ARROW-5480: - One slightly higher level issue is the extent to which we store Arrow schema information in the Parquet metadata. I have been thinking that we should actually store the whole serialized schema in the Parquet footer as an IPC message, so that we can refer to it when reading the file to set various read options > [Python] Pandas categorical type doesn't survive a round-trip through parquet > - > > Key: ARROW-5480 > URL: https://issues.apache.org/jira/browse/ARROW-5480 > Project: Apache Arrow > Issue Type: Improvement > Components: Python >Affects Versions: 0.11.1, 0.13.0 > Environment: python: 3.7.3.final.0 > python-bits: 64 > OS: Linux > OS-release: 5.0.0-15-generic > machine: x86_64 > processor: x86_64 > byteorder: little > pandas: 0.24.2 > numpy: 1.16.4 > pyarrow: 0.13.0 >Reporter: Karl Dunkle Werner >Priority: Minor > > Writing a string categorical variable to from pandas parquet is read back as > string (object dtype). I expected it to be read as category. > The same thing happens if the category is numeric -- a numeric category is > read back as int64. > In the code below, I tried out an in-memory arrow Table, which successfully > translates categories back to pandas. However, when I write to a parquet > file, it's not. > In the scheme of things, this isn't a big deal, but it's a small surprise. > {code:python} > import pandas as pd > import pyarrow as pa > df = pd.DataFrame({'x': pd.Categorical(['a', 'a', 'b', 'b'])}) > df.dtypes # category > # This works: > pa.Table.from_pandas(df).to_pandas().dtypes # category > df.to_parquet("categories.parquet") > # This reads back object, but I expected category > pd.read_parquet("categories.parquet").dtypes # object > # Numeric categories have the same issue: > df_num = pd.DataFrame({'x': pd.Categorical([1, 1, 2, 2])}) > df_num.dtypes # category > pa.Table.from_pandas(df_num).to_pandas().dtypes # category > df_num.to_parquet("categories_num.parquet") > # This reads back int64, but I expected category > pd.read_parquet("categories_num.parquet").dtypes # int64 > {code} -- This message was sent by Atlassian JIRA (v7.6.14#76016)
[jira] [Commented] (ARROW-5480) [Python] Pandas categorical type doesn't survive a round-trip through parquet
[ https://issues.apache.org/jira/browse/ARROW-5480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16898725#comment-16898725 ] Joris Van den Bossche commented on ARROW-5480: -- {quote}One slightly higher level issue is the extent to which we store Arrow schema information in the Parquet metadata. {quote} Possibly related to ARROW-5888, where we also need to store arrow-specific metadata for faithful roundtrip (in that case the timezone). Spark stores the all column types (and optional column metadata) in the key_value_metadata of the FileMetadata: For example for a file with a single int column {code} >>> meta = pq.read_metadata('test_pyspark_dataset/_metadata') >>> meta.metadata {b'org.apache.spark.sql.parquet.row.metadata': b'{"type":"struct","fields":[{"name":"a","type":"integer","nullable":true,"metadata":{}}]}'} {code} > [Python] Pandas categorical type doesn't survive a round-trip through parquet > - > > Key: ARROW-5480 > URL: https://issues.apache.org/jira/browse/ARROW-5480 > Project: Apache Arrow > Issue Type: Improvement > Components: Python >Affects Versions: 0.11.1, 0.13.0 > Environment: python: 3.7.3.final.0 > python-bits: 64 > OS: Linux > OS-release: 5.0.0-15-generic > machine: x86_64 > processor: x86_64 > byteorder: little > pandas: 0.24.2 > numpy: 1.16.4 > pyarrow: 0.13.0 >Reporter: Karl Dunkle Werner >Priority: Minor > > Writing a string categorical variable to from pandas parquet is read back as > string (object dtype). I expected it to be read as category. > The same thing happens if the category is numeric -- a numeric category is > read back as int64. > In the code below, I tried out an in-memory arrow Table, which successfully > translates categories back to pandas. However, when I write to a parquet > file, it's not. > In the scheme of things, this isn't a big deal, but it's a small surprise. > {code:python} > import pandas as pd > import pyarrow as pa > df = pd.DataFrame({'x': pd.Categorical(['a', 'a', 'b', 'b'])}) > df.dtypes # category > # This works: > pa.Table.from_pandas(df).to_pandas().dtypes # category > df.to_parquet("categories.parquet") > # This reads back object, but I expected category > pd.read_parquet("categories.parquet").dtypes # object > # Numeric categories have the same issue: > df_num = pd.DataFrame({'x': pd.Categorical([1, 1, 2, 2])}) > df_num.dtypes # category > pa.Table.from_pandas(df_num).to_pandas().dtypes # category > df_num.to_parquet("categories_num.parquet") > # This reads back int64, but I expected category > pd.read_parquet("categories_num.parquet").dtypes # int64 > {code} -- This message was sent by Atlassian JIRA (v7.6.14#76016)
[jira] [Commented] (ARROW-5480) [Python] Pandas categorical type doesn't survive a round-trip through parquet
[ https://issues.apache.org/jira/browse/ARROW-5480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16909085#comment-16909085 ] Wes McKinney commented on ARROW-5480: - I think this should be working now. I'll add some unit tests to close out this issue > [Python] Pandas categorical type doesn't survive a round-trip through parquet > - > > Key: ARROW-5480 > URL: https://issues.apache.org/jira/browse/ARROW-5480 > Project: Apache Arrow > Issue Type: Improvement > Components: Python >Affects Versions: 0.11.1, 0.13.0 > Environment: python: 3.7.3.final.0 > python-bits: 64 > OS: Linux > OS-release: 5.0.0-15-generic > machine: x86_64 > processor: x86_64 > byteorder: little > pandas: 0.24.2 > numpy: 1.16.4 > pyarrow: 0.13.0 >Reporter: Karl Dunkle Werner >Priority: Minor > > Writing a string categorical variable to from pandas parquet is read back as > string (object dtype). I expected it to be read as category. > The same thing happens if the category is numeric -- a numeric category is > read back as int64. > In the code below, I tried out an in-memory arrow Table, which successfully > translates categories back to pandas. However, when I write to a parquet > file, it's not. > In the scheme of things, this isn't a big deal, but it's a small surprise. > {code:python} > import pandas as pd > import pyarrow as pa > df = pd.DataFrame({'x': pd.Categorical(['a', 'a', 'b', 'b'])}) > df.dtypes # category > # This works: > pa.Table.from_pandas(df).to_pandas().dtypes # category > df.to_parquet("categories.parquet") > # This reads back object, but I expected category > pd.read_parquet("categories.parquet").dtypes # object > # Numeric categories have the same issue: > df_num = pd.DataFrame({'x': pd.Categorical([1, 1, 2, 2])}) > df_num.dtypes # category > pa.Table.from_pandas(df_num).to_pandas().dtypes # category > df_num.to_parquet("categories_num.parquet") > # This reads back int64, but I expected category > pd.read_parquet("categories_num.parquet").dtypes # int64 > {code} -- This message was sent by Atlassian JIRA (v7.6.14#76016)
[jira] [Commented] (ARROW-5480) [Python] Pandas categorical type doesn't survive a round-trip through parquet
[ https://issues.apache.org/jira/browse/ARROW-5480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16854163#comment-16854163 ] Wes McKinney commented on ARROW-5480: - Parquet has dictionary-encoding as a compression strategy but does not have Categorical per se. As part of ARROW-3246 we should eventually be able to preserve Categorical through Parquet round trips, but there's some tricky issues to sort out > [Python] Pandas categorical type doesn't survive a round-trip through parquet > - > > Key: ARROW-5480 > URL: https://issues.apache.org/jira/browse/ARROW-5480 > Project: Apache Arrow > Issue Type: Improvement > Components: Python >Affects Versions: 0.11.1, 0.13.0 > Environment: python: 3.7.3.final.0 > python-bits: 64 > OS: Linux > OS-release: 5.0.0-15-generic > machine: x86_64 > processor: x86_64 > byteorder: little > pandas: 0.24.2 > numpy: 1.16.4 > pyarrow: 0.13.0 >Reporter: Karl Dunkle Werner >Priority: Minor > > Writing a string categorical variable to from pandas parquet is read back as > string (object dtype). I expected it to be read as category. > The same thing happens if the category is numeric -- a numeric category is > read back as int64. > In the code below, I tried out an in-memory arrow Table, which successfully > translates categories back to pandas. However, when I write to a parquet > file, it's not. > In the scheme of things, this isn't a big deal, but it's a small surprise. > {code:python} > import pandas as pd > import pyarrow as pa > df = pd.DataFrame({'x': pd.Categorical(['a', 'a', 'b', 'b'])}) > df.dtypes # category > # This works: > pa.Table.from_pandas(df).to_pandas().dtypes # category > df.to_parquet("categories.parquet") > # This reads back object, but I expected category > pd.read_parquet("categories.parquet").dtypes # object > # Numeric categories have the same issue: > df_num = pd.DataFrame({'x': pd.Categorical([1, 1, 2, 2])}) > df_num.dtypes # category > pa.Table.from_pandas(df_num).to_pandas().dtypes # category > df_num.to_parquet("categories_num.parquet") > # This reads back int64, but I expected category > pd.read_parquet("categories_num.parquet").dtypes # int64 > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)