我将在前言中说这是一个玩具示例 - 我确实有这样做的动机,因为它处于其他一些链式操作的中间.
我有一个像DataFrame的东西
df
Out[234]:
host1 host2 host3
dates
2014-02-02 1 3 4
2014-02-03 5 2 1
2014-02-04 2 5 6
2014-02-05 4 6 1
2014-02-06 3 2 1
Run Code Online (Sandbox Code Playgroud)
我正在尝试生成一个由两列组成的新DataFrame,其中主机是索引 - 一列是最后一行中的值,第二列是最后一行中的值是否大于1.我的相应输出应该看起来喜欢:
newdf
Out[235]:
dates 2014-02-06 passes
host1 3 True
host2 2 True
host3 1 False
Run Code Online (Sandbox Code Playgroud)
如何使用链式操作执行此操作?
我认为,完成输出本身就很容易,我就是这么做的
newdf = df.tail(1).T
newdf['passes'] = newdf.iloc[:, 0] > 1
Run Code Online (Sandbox Code Playgroud)
我正在努力用链式操作进行操作的原因是因为只要我转换尾部,列名就变成了类型pandas.tslib.Timestamp,
df.tail(1).T
Out[236]:
dates 2014-02-06
host1 3
host2 2
host3 1
Run Code Online (Sandbox Code Playgroud)
我似乎无法访问重命名rename,因此我无法在一些布尔操作中访问它assign来创建新的"通过"列.
数据:
我的玩具DataFrame可以生成
df = pd.DataFrame(dict(dates=pd.date_range('2014-02-02', periods=5),
host1=[1, 5, 2, 4, 3],
host2=[3, 2, 5, 6, 2],
host3=[4, 1, 6, 1, 1])).set_index('dates')
Run Code Online (Sandbox Code Playgroud)
Psi*_*dom 10
您可以使用lambdaexpression in assign,其中参数是先前链接操作的结果:
df.tail(1).T.assign(passes = lambda x: x.iloc[:,0] > 1)
#dates 2014-02-06 00:00:00 passes
#host1 3 True
#host2 2 True
#host3 1 False
Run Code Online (Sandbox Code Playgroud)
你可以试试这个:
In [110]: df.tail(1).T.assign(passes=df.tail(1).values[0] > 1)
Out[110]:
dates 2014-02-06 00:00:00 passes
host1 3 True
host2 2 True
host3 1 False
Run Code Online (Sandbox Code Playgroud)