此问题的答案为community effort。编辑现有答案以改进此帖子。当前不接受新答案或互动。
在花了相当多的时间看了SO上的r和pandas标签之后,我得到的印象是pandas
问题不太可能包含可重复的数据,这是R社区一直非常鼓励的事情,多亏了this这样的指南,新手能够在整理这些例子方面得到一些帮助。2那些能够阅读这些指南并带着可复制的数据回来的人往往会有更好的运气得到他们问题的答案。
我们如何为pandas
问题创建良好的可重复示例?可以将简单的 Dataframe 放在一起,例如:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
但是许多示例数据集需要更复杂的结构,例如:
datetime
索引或数据- 多个分类变量(是否有一个等价于R的
expand.grid()
函数,它可以产生一些给定变量的所有可能组合?) - 多索引或面板数据
对于那些很难用几行代码模拟的数据集,是否有一个等效于R的dput()
的代码,允许您生成可复制粘贴的代码来重新生成您的数据结构?
5条答案
按热度按时间q3qa4bjr1#
好:
或者使用
pd.read_clipboard(sep='\s\s+')
使其"可复制和粘贴"。您可以通过突出显示并使用Ctrl + K(或者在每行前添加四个空格)来设置堆栈溢出的文本格式,或者在代码的上方和下方放置三个反引号(′ ′ ′),并且代码不缩进:自己测试
pd.read_clipboard(sep='\s\s+')
。df = df.head()
重现这个错误吗?如果不能,看看你能不能弥补一个小的数据框,展示你所面临的问题。但是每个规则都有一个例外,最明显的例外是性能问题(在这种情况下,一定要使用
%timeit
,也可能使用%prun
),在这里您应该生成:考虑使用
np.random.seed
,这样我们就有了完全相同的框架。话虽如此,"让这段代码对我来说更快"并不是严格意义上的网站主题。解释这些数字的来源:
5是B列中A为1的行的总和。
但说什么是不正确的:
A列在索引中,而不是列中。
sum的文档字符串仅声明"计算组值之和"
groupby文档没有给出这方面的任何示例。
df.groupby('A', as_index=False).sum()
。*pd.to_datetime
应用于它们,以获得良好的度量。有时这就是问题本身:它们是线。
坏:
正确的方法是在
set_index
调用中包含一个普通DataFrame:具体说明你是如何得到这些数字的(它们是什么)......仔细检查它们是否正确。
丑陋:
拜托,我们在日常工作中已经看到足够多的这种情况了。我们想帮助你,但是not like this...。删除介绍,只显示给你带来麻烦的步骤中的相关 Dataframe (或它们的小版本)。
kulphzqa2#
如何创建示例数据集
这主要是为了扩展AndyHayden的答案,提供了如何创建样本 Dataframe 的示例。Pandas和(特别是)NumPy为您提供了各种各样的工具,这样您通常可以用几行代码创建任何真实数据集的合理复制品。
导入NumPy和Pandas之后,如果您希望用户能够准确地重现您的数据和结果,请确保提供随机种子。
厨房Flume示例
下面的例子展示了你可以做的各种事情。所有有用的样本 Dataframe 都可以从它的子集中创建:
这产生:
一些注意事项:
np.repeat
和np.tile
(列d
和e
)对于以非常规则的方式创建组和索引非常有用。对于2列,这可以用来轻松地复制r的expand.grid()
,但在提供所有排列的子集方面也更灵活。然而,对于3列或更多列,语法很快就会变得笨拙。1.对于R的
expand.grid()
的更直接的替换,参见Pandas食谱中的itertools
解或here所示的np.meshgrid
解,这些解允许任意维数。1.使用
np.random.choice
可以做很多事情。例如,在g
列中,我们随机选择了2011年的6个日期。此外,通过设置replace=False
,我们可以确保这些日期是唯一的--如果我们想将其用作具有唯一值的索引,这非常方便。伪造股市数据
除了上述代码的子集之外,您还可以进一步组合这些技术来完成任何事情。例如,下面是一个简短的示例,它组合了
np.tile
和date_range
,为4只股票创建了相同日期的股票代码示例数据:现在,我们有了一个100行的示例数据集(每个股票代码25个日期),但我们只使用了4行,这样其他人就可以轻松地复制它,而无需复制和粘贴100行代码。如果有助于解释您的问题,您可以显示数据的子集:
qlckcl4x3#
回答者的日记
我对提问的最佳建议是利用回答问题的人的心理,作为其中一员,我可以给予他们了解我为什么回答某些问题,为什么不回答其他问题。
动机
我回答问题的动机有以下几个原因
1.在我努力给予社会的过程中,我发现这个网站是一个比以前更强大的资源。回答问题对我来说是一种学习的经历,我喜欢学习。Read this answer and comment from another vet。这种互动让我很快乐。
1.我喜欢积分!
1.参见#3。
1.我喜欢有趣的问题。
我所有最纯粹的意图都是伟大的,但如果我回答了1个或30个问题,我就会得到满足。是什么驱使我做出选择回答哪些问题,这是得分最大化的一个重要组成部分。
我也会花时间在有趣的问题上,但这是很少的,并没有帮助一个提问者谁需要一个解决方案,一个不感兴趣的问题。你最好的赌注,让我回答一个问题是提供一个成熟的盘子上的问题,让我回答它尽可能少的努力。如果我正在寻找两个问题,一个有代码,我可以复制粘贴创建所有的变量,我需要...我要那个!如果我有时间,我会再来看另一个的。
主要建议
让回答问题的人容易些。
你的名声不仅仅是你的名声。
我喜欢积分(我在上面提到过)。但这些分数并不是我真正的声誉。我真正的声誉是网站上其他人对我的看法的综合。我努力做到公平和诚实,我希望其他人能看到这一点。这对提问者来说意味着,我们记住了提问者的行为。如果你没有选择答案,也没有给好答案投赞成票,我记得。如果你的行为方式是我不喜欢的,或者是我喜欢的,我都会记得。这也影响到我会回答哪些问题。
无论如何,我可能会继续下去,但我会节省你们所有人谁真正读到这一点。
s8vozzvw4#
@Andy提供的编写好Pandas问题的说明是一个极好的开始,要了解更多信息,请参阅how to ask和如何创建Minimal, Complete, and Verifiable examples。
我有这些数据...
我想这么做...
我希望我的结果看起来像这样...
但是,当我试图这样做[这]时,我得到了下面的问题...
我试着通过做[这个]和[那个]来找到解决办法。
我该怎么补救?
根据所提供的数据量、示例代码和错误堆栈,读者需要花很长时间才能理解问题所在。尝试重新陈述问题,使问题本身位于顶部,然后提供必要的详细信息。
我试着通过做[这个]和[那个]来找到解决办法。
当我试着这样做时,我遇到了以下问题......
我希望我的最终结果看起来像这样...
这里有一些最小的代码,可以重现我的问题...
下面是如何重新创建示例数据:
df = pd.DataFrame({'A': [...], 'B': [...], ...})
有时只需要DataFrame的头部或尾部,你也可以使用@JohnE提出的方法来创建更大的数据集,这样其他人就可以复制这些数据集,使用他的例子来生成一个100行的股票价格DataFrame:
如果这是您的实际数据,您可能只想包含 Dataframe 的头部和/或尾部,如下所示(确保匿名化任何敏感数据):
您可能还希望提供DataFrame的说明(仅使用相关列)。这使其他人更容易检查每列的数据类型并识别其他常见错误(例如,日期为字符串、日期为datetime64、日期为object):
如果DataFrame具有多索引,则必须在调用
to_dict
之前进行重置。然后需要使用set_index
重新创建索引:vc6uscn95#
下面是我为Pandas
DataFrame
s编写的dput
版本--生成可重复报告的标准R工具。对于更复杂的帧,它可能会失败,但在简单的情况下,它似乎可以完成这项工作:现在,
DataFrame.to_dict
更冗长的输出,例如,对比
对于上面的
du
,但它 * 保留列类型 *。例如,在上面的测试用例中,因为
du.dtypes
是uint8
并且pd.DataFrame(du.to_dict()).dtypes
是int64
。