【问题标题】:Pandas: How to easily share a sample dataframe using df.to_dict()?Pandas:如何使用 df.to_dict() 轻松共享示例数据框?
【发布时间】:2020-07-29 22:17:55
【问题描述】:

尽管对How do I ask a good question?How to create a Minimal, Reproducible Example 有明确的指导,但许多人似乎只是忽略了在他们的问题中包含可重复的数据样本。那么当一个简单的pd.DataFrame(np.random.random(size=(5, 5))) 不够用时,有什么实用且简单的方法来重现数据样本呢?例如,您如何使用df.to_dict() 并将输出包含在问题中?

【问题讨论】:

    标签: python pandas plotly plotly-python


    【解决方案1】:

    答案:

    在许多情况下,使用df.to_dict() 的方法可以完美地完成工作!以下是我想到的两种情况:

    案例 1: 您已经从本地来源用 Python 构建或加载了一个数据框

    案例 2: 您在另一个应用程序(如 Excel)中有一个表格


    详情:

    案例 1: 您从本地源构建或加载了一个数据框

    假设您有一个名为 df 的 pandas 数据框,那么

    1. 在控制台或编辑器中运行 df.to_dict(),然后
    2. 复制格式化为字典的输出,然后
    3. 将内容粘贴到 pd.DataFrame(<output>) 中,并将该块包含在您现在可重现的代码 sn-p 中。

    案例 2: 您在另一个应用程序(如 Excel)中有一个表格

    根据来源和分隔符,例如(',', ';' '\\s+'),后者表示任何空格,您可以简单地:

    1. Ctrl+C内容
    2. 在您的控制台或编辑器中运行 df=pd.read_clipboard(sep='\\s+'),然后
    3. 运行df.to_dict(),然后
    4. df=pd.DataFrame(<output>) 中包含输出

    在这种情况下,您的问题的开头将如下所示:

    import pandas as pd
    df = pd.DataFrame({0: {0: 0.25474768796402636, 1: 0.5792136563952824, 2: 0.5950396800676201},
                       1: {0: 0.9071073567355232, 1: 0.1657288354283053, 2: 0.4962367707789421},
                       2: {0: 0.7440601352930207, 1: 0.7755487356392468, 2: 0.5230707257648775}})
    

    当然,对于较大的数据帧,这会有点笨拙。但很多时候,所有试图回答您问题的人都需要您的真实数据的一小部分样本,以便将您的数据结构考虑在内。

    还有两种方法可以处理更大的数据帧:

    1. 运行df.head(20).to_dict() 以仅包含第一个20 rows,并且
    2. 使用例如df.to_dict('split')(除了'split' 之外还有other options)更改您的dict 格式,将您的输出重塑为需要更少行的dict。

    这是一个使用 iris 数据集的示例,以及 plotly express 提供的其他地方。

    如果你只是运行:

    import plotly.express as px
    import pandas as pd
    df = px.data.iris()
    df.to_dict()
    

    这将产生近 1000 行的输出,并且作为可重现的样本不太实用。但如果你包含.head(25),你会得到:

    {'sepal_length': {0: 5.1, 1: 4.9, 2: 4.7, 3: 4.6, 4: 5.0, 5: 5.4, 6: 4.6, 7: 5.0, 8: 4.4, 9: 4.9},
     'sepal_width': {0: 3.5, 1: 3.0, 2: 3.2, 3: 3.1, 4: 3.6, 5: 3.9, 6: 3.4, 7: 3.4, 8: 2.9, 9: 3.1},
     'petal_length': {0: 1.4, 1: 1.4, 2: 1.3, 3: 1.5, 4: 1.4, 5: 1.7, 6: 1.4, 7: 1.5, 8: 1.4, 9: 1.5},
     'petal_width': {0: 0.2, 1: 0.2, 2: 0.2, 3: 0.2, 4: 0.2, 5: 0.4, 6: 0.3, 7: 0.2, 8: 0.2, 9: 0.1},
     'species': {0: 'setosa', 1: 'setosa', 2: 'setosa', 3: 'setosa', 4: 'setosa', 5: 'setosa', 6: 'setosa', 7: 'setosa', 8: 'setosa', 9: 'setosa'},
     'species_id': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}}
    

    现在我们正在取得进展。但是根据数据的结构和内容,这可能无法以令人满意的方式涵盖内容的复杂性。但是您可以通过像这样包含to_dict('split'),在更少的行中包含更多数据

    import plotly.express as px
    df = px.data.iris().head(10)
    df.to_dict('split')
    

    现在您的输出将如下所示:

    {'index': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
     'columns': ['sepal_length',
      'sepal_width',
      'petal_length',
      'petal_width',
      'species',
      'species_id'],
     'data': [[5.1, 3.5, 1.4, 0.2, 'setosa', 1],
      [4.9, 3.0, 1.4, 0.2, 'setosa', 1],
      [4.7, 3.2, 1.3, 0.2, 'setosa', 1],
      [4.6, 3.1, 1.5, 0.2, 'setosa', 1],
      [5.0, 3.6, 1.4, 0.2, 'setosa', 1],
      [5.4, 3.9, 1.7, 0.4, 'setosa', 1],
      [4.6, 3.4, 1.4, 0.3, 'setosa', 1],
      [5.0, 3.4, 1.5, 0.2, 'setosa', 1],
      [4.4, 2.9, 1.4, 0.2, 'setosa', 1],
      [4.9, 3.1, 1.5, 0.1, 'setosa', 1]]}
    

    现在您可以轻松增加.head(10) 中的数字,而不会过多地混淆您的问题。但有一个小缺点。现在您不能再直接在pd.DataFrame 中使用输入。但是,如果您包含一些关于index, column, and data 的规范,您就可以了。所以对于这个特定的数据集,我首选的方法是:

    import pandas as pd
    import plotly.express as px
    
    sample = {'index': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
                 'columns': ['sepal_length',
                  'sepal_width',
                  'petal_length',
                  'petal_width',
                  'species',
                  'species_id'],
                 'data': [[5.1, 3.5, 1.4, 0.2, 'setosa', 1],
                  [4.9, 3.0, 1.4, 0.2, 'setosa', 1],
                  [4.7, 3.2, 1.3, 0.2, 'setosa', 1],
                  [4.6, 3.1, 1.5, 0.2, 'setosa', 1],
                  [5.0, 3.6, 1.4, 0.2, 'setosa', 1],
                  [5.4, 3.9, 1.7, 0.4, 'setosa', 1],
                  [4.6, 3.4, 1.4, 0.3, 'setosa', 1],
                  [5.0, 3.4, 1.5, 0.2, 'setosa', 1],
                  [4.4, 2.9, 1.4, 0.2, 'setosa', 1],
                  [4.9, 3.1, 1.5, 0.1, 'setosa', 1],
                  [5.4, 3.7, 1.5, 0.2, 'setosa', 1],
                  [4.8, 3.4, 1.6, 0.2, 'setosa', 1],
                  [4.8, 3.0, 1.4, 0.1, 'setosa', 1],
                  [4.3, 3.0, 1.1, 0.1, 'setosa', 1],
                  [5.8, 4.0, 1.2, 0.2, 'setosa', 1]]}
    
    df = pd.DataFrame(index=sample['index'], columns=sample['columns'], data=sample['data'])
    df
    

    现在你可以使用这个数据框了:

        sepal_length  sepal_width  petal_length  petal_width species  species_id
    0            5.1          3.5           1.4          0.2  setosa           1
    1            4.9          3.0           1.4          0.2  setosa           1
    2            4.7          3.2           1.3          0.2  setosa           1
    3            4.6          3.1           1.5          0.2  setosa           1
    4            5.0          3.6           1.4          0.2  setosa           1
    5            5.4          3.9           1.7          0.4  setosa           1
    6            4.6          3.4           1.4          0.3  setosa           1
    7            5.0          3.4           1.5          0.2  setosa           1
    8            4.4          2.9           1.4          0.2  setosa           1
    9            4.9          3.1           1.5          0.1  setosa           1
    10           5.4          3.7           1.5          0.2  setosa           1
    11           4.8          3.4           1.6          0.2  setosa           1
    12           4.8          3.0           1.4          0.1  setosa           1
    13           4.3          3.0           1.1          0.1  setosa           1
    14           5.8          4.0           1.2          0.2  setosa           1
    

    这将大大增加您获得有用答案的机会!

    编辑:

    df_to_dict() 将无法读取像1: Timestamp('2020-01-02 00:00:00') 这样的时间戳,除非还包括from pandas import Timestamp

    【讨论】:

    • 感谢您的精彩回答!您能否分享一些您的解决方案所基于的文件?我找不到相关信息。非常感谢!
    • @nilsinelabore 我在这种情况下使用的唯一文档是pandas.DataFrame.to_dict 上的 pandas 文档 其余的答案实际上只是基于经验和阅读一堆 SO 帖子。
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2017-09-18
    • 2018-08-22
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多