当前位置: 首页 > 知识库问答 >
问题:

如何制作好可复制的熊猫示例

杨骏
2023-03-14

在花了相当长的时间观看了r和pandas标签之后,我得到的印象是pandas问题不太可能包含可复制的数据。这是R社区非常乐于鼓励的事情,多亏了这样的指南,新来者能够获得一些帮助来组合这些例子。能够阅读这些指南并带回可复制数据的人通常会更幸运地得到问题的答案。

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

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

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

  • datetime索引或数据

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

共有3个答案

党建义
2023-03-14

我提出问题的最好建议是利用回答问题的人的心理。作为这些人中的一员,我可以洞察为什么我回答某些问题,为什么我不回答其他问题。

出于几个原因,我有动力回答问题

  1. tackoverflow.com对我来说是非常宝贵的资源。我想回报。
  2. 在我努力回馈的过程中,我发现这个网站比以前更强大。回答问题对我来说是一种学习经历,我喜欢学习。阅读另一个兽医的回答和评论。这种互动让我很开心。
  3. 我喜欢积分!
  4. 参见#3。
  5. 我喜欢有趣的问题。

我所有最纯粹的意图都是伟大的,但如果我回答1个或30个问题,我就会得到满足。是什么驱使我选择回答哪些问题,这是最大化分数的一个重要组成部分。

我也会花时间在有趣的问题上,但这很少,对一个需要解决一个不感兴趣的问题的提问者没有帮助。你让我回答一个问题的最好办法是把这个问题放在一个成熟的盘子里,让我尽可能不费力地回答它。如果我在看两个问题,一个有代码,我可以复制粘贴来创建我需要的所有变量...我要那个!如果我有时间,也许我会回到另一个。

让回答问题的人更容易。

  • 提供创建所需变量的代码。

我喜欢点(我在上面提到过)。但这些观点并不是我真正的名声。我真正的名声是网站上其他人对我的看法的融合。我努力做到公平和诚实,我希望其他人也能看到这一点。这对提问者来说意味着,我们记得提问者的行为。如果你不选择答案并投票给好答案,我记得。如果你以我不喜欢的方式或我喜欢的方式行事,我记得。这也涉及到我要回答的问题。

不管怎样,我可能会继续,但我会放过所有真正阅读这篇文章的人。

陈项禹
2023-03-14

这主要是通过提供如何创建示例数据帧的示例来扩展AndyHayden的答案。Pandas和(特别是)NumPy为您提供了各种工具,这样您通常可以用几行代码创建任何真实数据集的合理传真。

导入NumPy和Pandas后,如果您希望人们能够准确地复制您的数据和结果,请务必提供随机种子。

import numpy as np
import pandas as pd

np.random.seed(123)

下面是一个例子,展示了您可以做的各种事情。所有类型的有用示例数据帧都可以从以下数据帧的子集创建:

df = pd.DataFrame({

    # some ways to create random data
    'a':np.random.randn(6),
    'b':np.random.choice( [5,7,np.nan], 6),
    'c':np.random.choice( ['panda','python','shark'], 6),

    # some ways to create systematic groups for indexing or groupby
    # this is similar to R's expand.grid(), see note 2 below
    'd':np.repeat( range(3), 2 ),
    'e':np.tile(   range(2), 3 ),

    # a date range and set of random dates
    'f':pd.date_range('1/1/2011', periods=6, freq='D'),
    'g':np.random.choice( pd.date_range('1/1/2011', periods=365,
                          freq='D'), 6, replace=False)
    })

这就产生了:

          a   b       c  d  e          f          g
0 -1.085631 NaN   panda  0  0 2011-01-01 2011-08-12
1  0.997345   7   shark  0  1 2011-01-02 2011-11-10
2  0.282978   5   panda  1  0 2011-01-03 2011-10-30
3 -1.506295   7  python  1  1 2011-01-04 2011-09-07
4 -0.578600 NaN   shark  2  0 2011-01-05 2011-02-27
5  1.651437   7  python  2  1 2011-01-06 2011-02-03

一些注意事项:

  1. np.repeatnp.tile(列de)对于以非常常规的方式创建组和索引非常有用。对于2列,这可用于轻松复制r的expand.grid(),但在提供所有排列的子集方面也更灵活。但是,对于3列或更多列,语法很快就会变得笨拙。

除了获取上述代码的子集外,您还可以进一步结合这些技术来做任何事情。例如,下面是一个简短的示例,它结合了np.tiledate\u range来创建涵盖相同日期的4只股票的样本股票代码数据:

stocks = pd.DataFrame({
    'ticker':np.repeat( ['aapl','goog','yhoo','msft'], 25 ),
    'date':np.tile( pd.date_range('1/1/2011', periods=25, freq='D'), 4 ),
    'price':(np.random.randn(100).cumsum() + 10) })

现在我们有了一个100行的样本数据集(每个股票代码有25个日期),但我们只使用了4行代码,这样其他人就可以轻松地复制,而无需复制和粘贴100行代码。如果有助于解释问题,则可以显示数据子集:

>>> stocks.head(5)

        date      price ticker
0 2011-01-01   9.497412   aapl
1 2011-01-02  10.261908   aapl
2 2011-01-03   9.438538   aapl
3 2011-01-04   9.515958   aapl
4 2011-01-05   7.554070   aapl

>>> stocks.groupby('ticker').head(2)

         date      price ticker
0  2011-01-01   9.497412   aapl
1  2011-01-02  10.261908   aapl
25 2011-01-01   8.277772   goog
26 2011-01-02   7.714916   goog
50 2011-01-01   5.613023   yhoo
51 2011-01-02   6.397686   yhoo
75 2011-01-01  11.736584   msft
76 2011-01-02  11.944519   msft
司徒杜吟
2023-03-14

注意:这里的想法对于堆栈溢出非常通用,实际上是一些问题。

>

  • 包括小的*示例DataFrame,或者作为可运行代码:

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

    或者使用pd.read_clipboard(sep='\s\s')将其设置为“复制和粘贴”,您可以格式化堆栈溢出突出显示的文本,并使用CtrlK(或在每行前面加四个空格),或者在代码上方和下方加上三个反勾(`````),使代码不凹陷:

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

    测试pd.自己阅读剪贴板(sep='\s\s')

    *我真的是指小,绝大多数的示例DataFrames可能少于6行引用需要,我敢打赌我可以在5行内完成。你能用df=df.head()重现错误吗?如果没有,摆弄一下,看看你是否能制作一个显示你面临的问题的小数据帧。

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

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

      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的docstring仅表示“计算组值之和”

    Groupby留档没有给出任何例子。

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

    如果您有时间戳列(例如,您正在重新采样或做其他事情)是相关的,那么请明确地对它们应用pd.\u datetime,以便更好地测量**。

      df['date'] = pd.to_datetime(df['date']) # this column ought to be date..
    

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

    >

  • 不要包含我们无法复制和粘贴的多索引(见上文)。这是对熊猫默认显示的一种不满,但仍然令人恼火:

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

    正确的方法是使用set\u 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
    

    具体说明你是如何得到这些数字的(它们是什么)。。。仔细检查他们是否正确。

    如果您的代码引发错误,请包含整个堆栈跟踪(如果太吵,可以稍后删除)。显示行号(以及它所针对的代码的相应行)。

    >

  • 不要链接到我们无法访问的CSV文件(理想情况下根本不要链接到外部源...)

      df = pd.read_csv('my_secret_file.csv')  # ideally with lots of parsing options
    

    大多数数据都是专有的,我们得到的是:编造类似的数据,看看你是否能重现问题(一些小问题)。

    不要含糊其辞地解释这种情况,比如你有一个“大”的数据框,顺便提到一些列名(确保不要提到它们的数据类型)。试着去了解一些完全没有意义的细节,而不去了解实际的情况。想必没有人会读到这一段的结尾。

    文章不好,用小例子比较容易。

    在开始实际问题之前,不要包含10(100°)行数据。

    拜托,我们在日常工作中看到的已经够多了。我们想帮忙,但不是像这样。。。。剪掉简介,在这一步中只显示给您带来麻烦的相关数据帧(或它们的小版本)。

  •  类似资料:
    • 我花了相当多的时间阅读了一些带有pyspark和spark-dataframe标签的问题,我经常发现海报没有提供足够的信息来真正理解他们的问题。我通常会评论,要求他们发布一个MCVE,但有时让他们展示一些输入/输出数据样本就像拔牙一样。 问题的一部分可能是人们不知道如何轻松地为Spark-Dataframes创建一个MCVE。我认为有一个spark-dataframe版本的这个pandas问题作为

    • 这与关于这个主题的几个问题相似。

    • 我想用替换大于任意数字(本例中为100)的

    • 好的,我刚刚开始学习python。我使用py魅力当前写的代码。我只是不明白我是如何安装模块的。例如,我希望加载excel文件。我已经看到可以使用熊猫或openpyxl,但我不知道如何访问这些模块。我在网上看到的所有视频只需键入安装openpyxl或pip安装熊猫。“安装”在我的窗口上不是一个有效的功能。其他功能出现突出显示之前,我完成它们和安装似乎是不认识,一旦执行我得到一个语法错误的安装。安装前

    • 我在CSV文件中有一些数据,想打印出来,但图形没有显示出来 这是CSV文件http://www.mediafire.com/file/2gtbxm5adom7m4j/pop.csv

    • 问题内容: 我注意到程序中存在一个错误,发生该错误的原因是因为熊猫似乎是通过引用熊猫数据框而不是通过值进行复制。我知道不可变对象将始终通过引用传递,但pandas数据帧不是不可变的,因此我不明白为什么它通过引用传递。谁能提供一些信息? 谢谢!安德鲁 问题答案: Python中的所有函数都是“按引用传递”,没有“按值传递”。如果要显式复制pandas对象,请尝试。