这是一个自我回答的帖子.常见问题是在给定的开始日期和结束日期之间随机生成日期.
有两种情况需要考虑:
例如,给定一些开始日期2015-01-01和结束日期2018-01-01,如何使用pandas在此范围之间采样N个随机日期?
假设我创建了一个包含两列b(一个DateTime)和c一个整数的pandas DataFrame .现在我想从第一列(b)中的值创建一个DatetimeIndex :
import pandas as pd
import datetime as dt
a=[1371215423523845, 1371215500149460, 1371215500273673, 1371215500296504, 1371215515568529, 1371215531603530, 1371215576463339, 1371215579939113, 1371215731215054, 1371215756231343, 1371215756417484, 1371215756519690, 1371215756551645, 1371215756578979, 1371215770164647, 1371215820891387, 1371215821305584, 1371215824925723, 1371215878061146, 1371215878173401, 1371215890324572, 1371215898024253, 1371215926634930, 1371215933513122, 1371216018210826, 1371216080844727, 1371216080930036, 1371216098471787, 1371216111858392, 1371216326271516, 1371216326357836, 1371216445401635, 1371216445401635, 1371216481057049, 1371216496791894, 1371216514691786, 1371216540337354, 1371216592180666, 1371216592339578, 1371216605823474, 1371216610332627, 1371216623042903, 1371216624749566, 1371216630631179, 1371216654267672, 1371216714011662, 1371216783761738, 1371216783858402, 1371216783858402, 1371216783899118, 1371216976339169, 1371216976589850, 1371217028278777, 1371217028560770, 1371217170996479, 1371217176184425, 1371217176318245, 1371217190349372, 1371217190394753, 1371217272797618, 1371217340235667, 1371217340358197, …Run Code Online (Sandbox Code Playgroud) 我想定义一个有效的整数下限函数,即从float或double转换为向负无穷大执行截断。
我们可以假设这些值使得没有整数溢出发生。到目前为止,我有一些选择
转换为int 这需要对负值进行特殊处理,因为转换会截断为零。
I= int(F); if (I < 0 && I != F) I--;
Run Code Online (Sandbox Code Playgroud)将floor的结果转换为int;
int(floor(F));
Run Code Online (Sandbox Code Playgroud)强制转换为int以获得较大的正数(对于较大的值,这可能会返回错误的结果);
int(F + double(0x7fffffff)) - 0x7fffffff;
Run Code Online (Sandbox Code Playgroud)众所周知,将数据类型转换为int很慢。如果测试也是如此。我尚未设置发言权功能的时间,但是看到帖子声称它也很慢。
您能在速度,准确性或允许范围方面考虑更好的替代方法吗?它不需要是便携式的。目标是最新的x86 / x64体系结构。
这篇文章的内容最初是作为Pandas Merging 101的一部分,但由于完全公开 这个主题所需的内容的性质和大小,它已被转移到自己的QnA.
给出两个简单的DataFrame;
left = pd.DataFrame({'col1' : ['A', 'B', 'C'], 'col2' : [1, 2, 3]})
right = pd.DataFrame({'col1' : ['X', 'Y', 'Z'], 'col2' : [20, 30, 50]})
left
col1 col2
0 A 1
1 B 2
2 C 3
right
col1 col2
0 X 20
1 Y 30
2 Z 50
Run Code Online (Sandbox Code Playgroud)
可以计算这些帧的叉积,看起来像:
A 1 X 20
A 1 Y 30
A 1 Z 50
B 2 X 20
B 2 Y 30
B 2 Z 50 …Run Code Online (Sandbox Code Playgroud) 我有一个用sys.stdout.write()和创建输出的脚本sys.stderr.write().最近我发布了一些关于脚本其他方面的问题,我注意到发布答案的人似乎更喜欢print('some text', file=sys.stdout).我对输出的主要关注只是它可以被shell传送到文件或作为另一个程序的输入.有人可以解释(或指导我现有的解释)两者之间的差异,print()以及sys.stdout.write每个应该使用的情况和这些惯例的合理性吗?
我有一个数据帧并在FIPS中做了一个groupby并总结了那些运行良好的组.
kl = ks.groupby('FIPS')
kl.aggregate(np.sum)
Run Code Online (Sandbox Code Playgroud)
我只想要一个普通的Dataframe,但我有一个pandas.core.groupby.DataFrameGroupBy对象.
我有2个数据帧,其中一个数据帧具有另一个(但不是全部)行的补充信息.
names = df({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],
'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank'],
'classification':['thief','thief','good','thief']})
Run Code Online (Sandbox Code Playgroud)
我想从info上面的数据框中获取分类列,并将其添加到names上面的数据框中.但是,当我这样做时combined = pd.merge(names, info),结果数据帧只有4行长.所有没有补充信息的行都将被删除.
理想情况下,我会将缺失列中的值设置为unknown.导致数据框中有些人是有效的,有些是好的,其余的是未知的.
编辑:我收到的第一个答案之一建议使用合并outter似乎做了一些奇怪的事情.这是一个代码示例:
names = df({'names':['bob','frank','bob','bob','bob''james','tim','ricardo','mike','mark','joan','joe'],
'position':['dev','dev','dev','dev','dev','dev''sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank','joe','bill'],
'classification':['thief','thief','good','thief','good','thief']})
what = pd.merge(names, info, how="outer")
what.fillna("unknown")
Run Code Online (Sandbox Code Playgroud)
奇怪的是,在输出中我会得到一行,其结果名称是"bobjames",另一行的位置是"devsys".最后,即使bill没有出现在名称数据框中,它也会显示在结果数据框中.所以我真的需要一种方法来说明在这个其他数据框中查找一个值,如果你在这些列上发现了什么.
我知道numpy数组有一个叫做shape的方法,它返回[No.of rows,No.of columns],shape [0]给你行数,shape [1]给你列数.
a = numpy.array([[1,2,3,4], [2,3,4,5]])
a.shape
>> [2,4]
a.shape[0]
>> 2
a.shape[1]
>> 4
Run Code Online (Sandbox Code Playgroud)
但是,如果我的数组只有一行,则返回[Numberof columns,].并且形状[1]将不在索引中.例如
a = numpy.array([1,2,3,4])
a.shape
>> [4,]
a.shape[0]
>> 4 //this is the number of column
a.shape[1]
>> Error out of index
Run Code Online (Sandbox Code Playgroud)
现在如果数组可能只有一行,如何获取numpy数组的行数?
谢谢
假设我有一个列表:
l=['a','b','c']
Run Code Online (Sandbox Code Playgroud)
及其后缀列表:
l2 = ['a_1', 'b_1', 'c_1']
Run Code Online (Sandbox Code Playgroud)
我希望所需的输出为:
out_l = ['a','a_1','b','b_2','c','c_3']
Run Code Online (Sandbox Code Playgroud)
结果是上面两个列表的交错版本.
我可以编写常规for循环来完成这项工作,但我想知道是否有更多Pythonic方式(例如,使用list comprehension或lambda)来完成它.
我尝试过这样的事情:
list(map(lambda x: x[1]+'_'+str(x[0]+1), enumerate(a)))
# this only returns ['a_1', 'b_2', 'c_3']
Run Code Online (Sandbox Code Playgroud)
此外,对于一般情况需要做出哪些改变,即对于2个或更多列表,其中l2不一定是衍生物l?
假设我有一个像这样的多级字典
mydict = {
'first': {
'second': {
'third': {
'fourth': 'the end'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想像这样访问它
test = get_entry(mydict, 'first.second.third.fourth')
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是什么
def get_entry(dict, keyspec):
keys = keyspec.split('.')
result = dict[keys[0]]
for key in keys[1:]:
result = dict[key]
return result
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?根据%timeit,函数的运行时间是1.26us,而访问字典的标准方式是这样的
foo = mydict['first']['second']['third']['fourth']
Run Code Online (Sandbox Code Playgroud)
需要541ns.如果可能的话,我正在寻找将其修剪到800ns范围的方法.
谢谢
python ×9
pandas ×5
dataframe ×2
numpy ×2
performance ×2
arrays ×1
c++ ×1
datetime ×1
dictionary ×1
floor ×1
list ×1
merge ×1
python-2.7 ×1
python-3.x ×1
random ×1
recursion ×1
x86-64 ×1