小编典典

如何制作良好的可重现 pandas 示例

all

花了相当多的时间观看 SO 上的r和pandas标签,我得到的印象是pandas问题不太可能包含可重复的数据。这是 R
社区一直非常鼓励的事情,并且感谢这样的指南,新手能够在整理这些示例时获得一些帮助。能够阅读这些指南并返回可重复数据的人通常会更幸运地获得问题的答案。

我们如何为pandas问题创建良好的可重复示例?可以将简单的数据框放在一起,例如:

import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'], 
                   'income': [40000, 50000, 42000]})

但是许多示例数据集需要更复杂的结构,例如:

  • datetime指数或数据
  • 多个分类变量(是否有等效于 R 的expand.grid()函数,它产生某些给定变量的所有可能组合?)
  • MultiIndex 或面板数据

对于难以使用几行代码模拟的数据集,是否有与 R 等效的方法dput(),可让您生成可复制粘贴的代码以重新生成数据结构?


阅读 74

收藏
2022-06-14

共1个答案

小编典典

注意:这里的想法来说是非常通用的,确实是 questions

免责声明:写一个好问题 很难

好:

  • 确实包含 small* 示例 DataFrame,或者作为可运行代码:
    In [1]: df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
    

或使用 使其“可复制和可粘贴” pd.read_clipboard(sep='\s\s+'),您可以格式化 Stack Overflow
突出显示的文本并使用Ctrl+ K(或在每行前添加四个空格),或在代码上方和下方放置三个反引号(```),代码不缩进:

    In [2]: df
Out[2]:
   A  B
0  1  2
1  1  3
2  4  6

测试pd.read_clipboard(sep='\s\s+')自己。

  • 我真的是说 。绝大多数示例 DataFrame 可能少于 6 行[需要引用], 我敢打赌我可以在 5 行中完成。 你能用 重现错误df = df.head()吗?如果没有,请四处寻找是否可以组成一个小型 DataFrame 来展示您所面临的问题。

  • 每个规则都有一个例外,很明显的一个是针对性能问题( 在这种情况下肯定使用 %timeit 并且可能使用 %prun),您应该在哪里生成:df = pd.DataFrame(np.random.randn(100000000, 10)). 考虑使用np.random.seed所以我们有完全相同的框架。说,“让这个代码对我来说快速”并不是该网站的严格主题。

  • 写出你想要的结果(与上面类似)

    In [3]: iwantthis
    

    Out[3]:
    A B
    0 1 5
    1 4 6

解释这些数字的来源:5 是 A 为 1 的行的 B 列的总和。

  • 显示您尝试过 的代码:
    In [4]: df.groupby('A').sum()
    

    Out[4]:
    B
    A
    1 5
    4 6

但是说什么是不正确的:A 列在索引中而不是列中。

  • 一定要表明你已经做了一些研究(搜索文档,并给出一个总结:

sum 的文档字符串只是说明“计算组值的总和”

groupby 文档没有为此提供任何示例。

旁白:这里的答案是使用df.groupby('A', as_index=False).sum().

  • 如果您有时间戳列是相关的,例如您正在重新采样或其他什么,那么请明确并适用pd.to_datetime于它们以获得良好的衡量**。
    df['date'] = pd.to_datetime(df['date']) # this column ought to be date..
    

** 有时这就是问题本身:它们是字符串。

坏处:

  • 不包括 MultiIndex, 我们无法复制和粘贴 (见上文)。这是对 Pandas 的默认显示的一种不满,但仍然很烦人:
    In [11]: df
    

    Out[11]:
    C
    A B
    1 2 3
    2 6

正确的方法是在调用中包含一个普通的 DataFrameset_index

    In [12]: df = pd.DataFrame([[1, 2, 3], [1, 2, 6]], columns=['A', 'B', 'C']).set_index(['A', 'B'])

In [13]: df
Out[13]:
     C
A B
1 2  3
  2  6
  • 在给出你想要的结果时,请提供洞察力:
       B
    

    A
    1 1
    5 0

请具体说明您如何获得这些数字(它们是什么)......仔细检查它们是否正确。

  • 如果您的代码抛出错误,请务必包含整个堆栈跟踪(如果太嘈杂,可以稍后将其编辑掉)。显示行号(以及它所针对的代码的相应行)。

丑陋的:

大多数数据是专有的 ,我们得到:组成类似的数据,看看你是否可以重现问题(一些小问题)。

  • 不要用语言模糊地解释这种情况,比如你有一个“大”的 DataFrame,顺便提及一些列名(一定不要提及它们的 dtypes)。在没有看到实际背景的情况下,尝试深入了解一些完全没有意义的事情的细节。大概没有人会读到这一段的结尾。

散文不好,用小例子更容易。

  • 在解决您的实际问题之前,不要包括 10+ (100+??) 行数据。

拜托,我们在日常工作中看到了足够多的这种情况。 我们想帮忙,但不是这样...... _ _剪掉介绍,在给你带来麻烦的步骤中只显示相关的 DataFrames(或它们的小版本)。

不管怎样,尽情学习 Python、NumPy 和 Pandas!

2022-06-14