我是pandas的新手,似乎无法使用merge函数:
>>> left >>> right
a b c a c d
0 1 4 9 0 1 7 13
1 2 5 10 1 2 8 14
2 3 6 11 2 3 9 15
3 4 7 12
Run Code Online (Sandbox Code Playgroud)
在a列的左连接中,我想通过JOINED KEYS更新常用列.注意列c中的最后一个值来自LEFT表,因为没有匹配项.
>>> final
a b c d
0 1 4 7 13
1 2 5 8 14
2 3 6 9 15
3 4 7 12 NAN
Run Code Online (Sandbox Code Playgroud)
我应该如何使用Pandas合并功能?谢谢.
我有数据帧:
df = pd.DataFrame({'ID':[1,1,2,2,3,3],
'YEAR' : [2011,2012,2012,2013,2013,2014],
'V': [0,1,1,0,1,0],
'C':[00,11,22,33,44,55]})
Run Code Online (Sandbox Code Playgroud)
我想按ID分组,并在每个组中选择V = 0的行.
这似乎不起作用:
print(df.groupby(['ID']).filter(lambda x: x['V'] == 0))
Run Code Online (Sandbox Code Playgroud)
出了错误:
TypeError:filter函数返回一个Series,但是期望一个标量bool
如何使用过滤器来实现目标?谢谢.
编辑:V上的条件可能因组而异,例如,对于ID 1,V == 0,对于ID 2,V == 1,此信息可通过另一个DF获得:
df = pd.DataFrame({'ID':[1,2,3],
'V': [0,1,0])
Run Code Online (Sandbox Code Playgroud)
那么如何在每个组内进行行过滤?
我试图使用MLE拟合多元正态分布的参数.
import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize
from scipy.stats import multivariate_normal as mnorm
def estimation(obs,fun,init,method='Nelder-Mead'):
mle = lambda param: -np.sum(fun(*[obs,param])) ## negate since we will minimize
result = minimize(mle,init,method=method)
return result.x
Run Code Online (Sandbox Code Playgroud)
拟合单变量正态分布是好的:
obs = np.random.normal(1,4,50000)
ini = [0,1]
print(estimation(obs,lambda ob,p:norm.logpdf(ob,p[0],p[1]),ini))
Run Code Online (Sandbox Code Playgroud)
但是遇到了多变量的一些问题(错误将数组赋值给变量):
obs_m = np.random.multivariate_normal([0,0],[[1,0],[0,100]],50000)
ini_m = [[0,0],[[1,0],[0,100]]]
print(estimation(obs_m,lambda ob,p:mnorm.logpdf(ob,p[0],p[1],ini_m))
Run Code Online (Sandbox Code Playgroud)
似乎优化算法不适用于任意数组/矩阵.我必须将平均数组和协方差矩阵打包成一个平面阵列,以便最小化.
ini_m = [0,0,1,0,0,100]
print(estimation(obs_m,lambda ob,p:mnorm.logpdf(ob,[p[0],p[1]],[[p[2],p[3]],[p[4],p[5]]]),ini_m))
Run Code Online (Sandbox Code Playgroud)
显然,当尺寸增加时,这将很快失控,或者在没有封闭形式解决方案的情况下,这将更加复杂.这里最好做什么?谢谢.
我有一个数据帧:
df = pd.DataFrame({'c':[0,1,1,2,2,2], 'date':pd.to_datetime(['2016-01-01','2016-02-01','2016-03-01','2016-04-01','2016-05-01','2016-06-01'])})
Run Code Online (Sandbox Code Playgroud)
对于每一行,我想得到一个数字=每个日期的月份数(Jan = 1,Feb = 2等)+该组的长度(第一组有1个成员,第2组有2个等):
所以它应该返回类似的东西:
c date num
0 2016-01-01 2
1 2016-02-01 4
1 2016-03-01 5
2 2016-04-01 7
2 2016-05-01 8
2 2016-06-01 9
Run Code Online (Sandbox Code Playgroud)
我创建了一个函数:
def testlambda(x):
print(x)
return x.dt.month.astype('int') + len(x)
Run Code Online (Sandbox Code Playgroud)
并使用groupby + transform:
df['num'] = df.groupby(['c'])['date'].transform(lambda x: testlambda(x))
Run Code Online (Sandbox Code Playgroud)
但是返回的新列仍然是日期格式,即使我的lambda返回int.
该怎么办?
dft = pd.DataFrame({'C1': ['A','A','B','B'],
'C2': [1,2,3,4]})
def lam3(df):
return pd.DataFrame({'X': ['C','D','E'],
'Y': [11,22,33]})
Run Code Online (Sandbox Code Playgroud)
给定上述数据帧和函数(我无法更改),我想运行 groupby+apply 以便每个组返回一个数据帧,如下所示
C1 C2 X Y
0 A 1 C 11
1 A 1 D 22
2 A 1 E 33
3 A 2 C 11
4 A 2 D 22
5 A 2 E 33
6 B 3 C 11
7 B 3 D 22
8 B 3 E 33
9 B 4 C 11
10 B 4 D 22
11 B 4 E 33 …Run Code Online (Sandbox Code Playgroud) 给定一个数据帧:
df = pd.DataFrame({'c':[0,1,1,2,2,2],'date':pd.to_datetime(['2016-01-01','2016-02-01','2016-03-01','2016-04-01','2016-05-01','2016-06-05'])})
Run Code Online (Sandbox Code Playgroud)
如何从上个月开始每个日期?以下不适用于6/5,并且有一些额外的时间部分.
pd.to_datetime(df['date'], format="%Y%m") + pd.Timedelta(-1,unit='M') + MonthBegin(0)
Run Code Online (Sandbox Code Playgroud)
编辑
我有一个解决方法(后退2步,前进1步):
(df['date']+ pd.Timedelta(-2,unit='M')+ MonthBegin(1)).dt.date
Run Code Online (Sandbox Code Playgroud)
不喜欢这个.应该有更好的东西.
我正在阅读这篇文章,但不完全了解 xgboost 中有关函数 CV 和参数“树数”的详细信息。
假设我们从特征和目标值的数据帧开始。CV在每一轮做什么?如果 CV 结果有 500 行(即有 500 棵决策树),每棵树是如何构造的?500 棵树如何组合以产生单个对数损失数?
如果我们可以从 CV 函数中得到一个单一的预测,为什么我们需要 XGBClassifier.fit 来生成一个模型(因此是一个损失数)?
谢谢你。
试图将1/0的列表转换为布尔列表.
bool([1,0,1,0])似乎不起作用.
[1,0,1,0] == 1不起作用.
还有另一种方式(希望非列表理解)吗?