我想使用groupby().transform()对(已排序)数据集中的每个记录块进行自定义(累积)转换.除非我确保我有一个唯一的密钥,否则它不起作用.为什么?
这是一个玩具示例:
df = pd.DataFrame([[1,1],
[1,2],
[2,3],
[3,4],
[3,5]],
columns='a b'.split())
df['partials'] = df.groupby('a')['b'].transform(np.cumsum)
df
Run Code Online (Sandbox Code Playgroud)
给出了预期的:
a b partials
0 1 1 1
1 1 2 3
2 2 3 3
3 3 4 4
4 3 5 9
Run Code Online (Sandbox Code Playgroud)
但如果'a'是关键,那一切都会出错:
df = df.set_index('a')
df['partials'] = df.groupby(level=0)['b'].transform(np.cumsum)
df
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-146-d0c35a4ba053> in <module>()
3
4 df = df.set_index('a')
----> 5 df.groupby(level=0)['b'].transform(np.cumsum)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/groupby.pyc in transform(self, func, *args, **kwargs)
1542 res = wrapper(group)
1543 # result[group.index] = res …Run Code Online (Sandbox Code Playgroud) 更新:从版本0.20.0开始,pandas cut/qcut处理日期字段.有关更多信息,请参阅新功能.
pd.cut和pd.qcut现在支持datetime64和timedelta64 dtypes(GH14714,GH14798)
原始问题: Pandas cut和qcut函数非常适合用于数据透视表等的"bucketing"连续数据,但我看不到一种简单的方法来获取日期时间轴.令人沮丧,因为大熊猫在所有与时间有关的东西中都是如此之大!
这是一个简单的例子:
def randomDates(size, start=134e7, end=137e7):
return np.array(np.random.randint(start, end, size), dtype='datetime64[s]')
df = pd.DataFrame({'ship' : randomDates(10), 'recd' : randomDates(10),
'qty' : np.random.randint(0,10,10), 'price' : 100*np.random.random(10)})
df
price qty recd ship
0 14.723510 3 2012-11-30 19:32:27 2013-03-08 23:10:12
1 53.535143 2 2012-07-25 14:26:45 2012-10-01 11:06:39
2 85.278743 7 2012-12-07 22:24:20 2013-02-26 10:23:20
3 35.940935 8 2013-04-18 13:49:43 2013-03-29 21:19:26
4 54.218896 8 2013-01-03 09:00:15 2012-08-08 12:50:41
5 61.404931 9 2013-02-10 19:36:54 2013-02-23 13:14:42 …Run Code Online (Sandbox Code Playgroud) 如果我有两个已经在兼容键上排序的数据帧(或系列),我希望能够便宜地将它们合并在一起并保持排序.除了通过concat()和显式sort()之外,我看不到这样做的方法
a = pd.DataFrame([0,1,2,3], index=[1,2,3,5], columns=['x'])
b = pd.DataFrame([4,5,6,7], index=[0,1,4,6], columns=['x'])
print pd.concat([a,b])
print pd.concat([a,b]).sort()
x
1 0
2 1
3 2
5 3
0 4
1 5
4 6
6 7
x
0 4
1 0
1 5
2 1
3 2
4 6
5 3
6 7
Run Code Online (Sandbox Code Playgroud)
看起来有一些关于numpy数组的相关讨论,暗示了一种"交错"方法,但我没有找到一个好的答案.
我正在使用matplotlib底图来绘制美国大陆的地图.有没有办法将海岸线/国家边界过滤到美国?作为加拿大人,我通常不想排除加拿大,但希望在这种情况下:-)
from mpl_toolkits.basemap import Basemap
plt.figure(figsize=(10,6))
m = Basemap(width=5e6,height=3e6,projection='laea',
resolution='c',lat_0=39, lon_0=-96)
m.drawcoastlines(color="grey")
m.drawcountries(color="grey")
m.drawstates(color="grey")
plt.show()
Run Code Online (Sandbox Code Playgroud)