花了相当多的时间观看了这两部作品r and pandasSO 上的标签,我得到的印象是pandas
问题不太可能包含可重复的数据。这是 R 社区非常鼓励的事情,并且感谢像这样的指南this,新手可以在整理这些示例时获得一些帮助。能够阅读这些指南并返回可重复数据的人通常会更幸运地获得问题的答案。
我们如何才能创建良好的可重复示例pandas
问题?可以将简单的数据框放在一起,例如:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
但许多示例数据集需要更复杂的结构,例如:
-
datetime
指数或数据
- 多个分类变量(是否有相当于 R 的
expand.grid()
函数,它产生一些给定变量的所有可能的组合?)
- 多索引数据
对于难以使用几行代码模拟的数据集,是否有与 R 等效的数据集dput()
允许您生成可复制粘贴的代码来重新生成数据结构?
注意:这里的大多数想法对于 Stack Overflow 来说都是非常通用的,实际上是一般问题。看最小的、可重复的示例 or 简短、独立、正确的示例.
免责声明:写一个好问题是hard.
好处:
-
请包含一个小示例 DataFrame,或者作为可运行代码:
In [1]: df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
或使其“可复制并粘贴”使用pd.read_clipboard(sep='\s\s+')
。自己测试一下。
In [2]: df
Out[2]:
A B
0 1 2
1 1 3
2 4 6
-
You can format the text for Stack Overflow by highlighting and using Ctrl+K (or prepend four spaces to each line), or place three backticks (```) above and below your code with your code unindented.
-
I really do mean small. The vast majority of example DataFrames could be fewer than 6 rows,[citation needed] and I bet I can do it in 5. Can you reproduce the error with df = df.head()
? If not, fiddle around to see if you can make up a small DataFrame which exhibits the issue you are facing.
但每条规则都有一个例外,最明显的一个是性能问题(在这种情况下肯定使用%timeit并且可能%prun来分析您的代码),您应该在其中生成:
df = pd.DataFrame(np.random.randn(100000000, 10))
考虑使用np.random.seed
所以我们有完全相同的框架。话虽如此,“让这段代码对我来说更快”并不是该网站严格的主题。
-
为了获得可运行的代码,df.to_dict通常很有用,不同的orient
不同情况的选择。在上面的示例中,我可以从以下位置获取数据和列df.to_dict('split')
.
-
写下你想要的结果(与上面类似)
In [3]: iwantthis
Out[3]:
A B
0 1 5
1 4 6
解释一下这些数字的来源:
5 是 A 为 1 的行的 B 列之和。
-
Do show the code你已经尝试过:
In [4]: df.groupby('A').sum()
Out[4]:
B
A
1 5
4 6
但说一下不正确的地方:
A 列位于索引中而不是列中。
-
一定要表明你已经做了一些研究(搜索文档, 搜索堆栈溢出),并给出总结:
sum 的文档字符串简单地说明了“计算组值的总和”
The 分组依据文档没有给出任何例子。
旁白:这里的答案是使用df.groupby('A', as_index=False).sum()
.
-
如果您有时间戳列相关,例如你正在重新采样或其他什么,然后明确并应用pd.to_datetime
对他们来说是一个很好的衡量标准。
df['date'] = pd.to_datetime(df['date']) # this column ought to be date.
有时这就是问题本身:它们是字符串。
The Bad:
-
不包括多重索引,这我们无法复制和粘贴(往上看)。这对 Pandas 的默认显示有点不满,但仍然很烦人:
In [11]: df
Out[11]:
C
A B
1 2 3
2 6
正确的方法是包含一个普通的 DataFrame 和set_index call:
In [12]: df = pd.DataFrame([[1, 2, 3], [1, 2, 6]], columns=['A', 'B', 'C'])
In [13]: df = df.set_index(['A', 'B'])
In [14]: df
Out[14]:
C
A B
1 2 3
2 6
-
在给出您想要的结果时,请务必深入了解它是什么:
B
A
1 1
5 0
具体说明您如何获得这些数字(它们是什么)...仔细检查它们是否正确。
-
如果你的代码抛出错误,包含整个堆栈跟踪。如果噪音太大,可以稍后编辑掉。显示行号以及它所针对的代码的相应行。
-
熊猫2引入了许多changes,因此如果您得到意外的输出,请包含以下版本:
pd.__version__
在这一点上,您可能还想包括 Python 的版本、您的操作系统和任何其他库。你可以使用pd.show_versions()
or the session_info包(显示加载的库和 Jupyter/IPython 环境)。
丑陋的:
-
不要链接到我们无权访问的 CSV 文件(最好根本不要链接到外部源)。
df = pd.read_csv('my_secret_file.csv') # ideally with lots of parsing options
大多数数据都是专有的,我们明白了。制作类似的数据,看看是否可以重现该问题(一些小问题)。
-
不要用语言含糊地解释这种情况,就像你有一个“大”的 DataFrame 一样,顺便提及一些列名(确保不要提及它们的数据类型)。尝试在没有看到实际背景的情况下深入探讨一些完全没有意义的事情的细节。想必没有人会读到本段的结尾。
论文很糟糕;通过小例子就更容易了。
-
在解决实际问题之前,不要包含 10+ (100+??) 行数据整理。
拜托,我们在日常工作中看到的已经够多了。我们想提供帮助,但是不是这样的...。
剪掉介绍,只在给您带来麻烦的步骤中显示相关的 DataFrame(或其小版本)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)