我一直在听到很多关于 pandas apply 很慢的消息,应该尽可能少地使用它。
我这里有一个情况:
df = pd.DataFrame({'Date': ['2019-01-02', '2019-01-03', '2019-01-04'],
'Fund_ID': [9072, 9072, 9072],
'Fund_Series': ['A', 'A', 'A'],
'Value': [1020.0, 1040.4, 1009.188],
'Dividend': [0.0, 0.0, 52.02]})
Run Code Online (Sandbox Code Playgroud)
我想在分组后做一些调整后的加权操作,如下所示:
df['Pct_Change_Adjusted'] = df.groupby(['Fund_ID', 'Fund_Series'], as_index=False) \
.apply(lambda x: (x.Value + x.Dividend)/(x.Value.shift()+x.Dividend.shift()) ) \
.reset_index(drop=True).values[0]
print(df)
Date Dividend Fund_ID Fund_Series Value Pct_Change_Adjusted
0 2019-01-02 0.00 9072 A 1020.000 NaN
1 2019-01-03 0.00 9072 A 1040.400 0.02
2 2019-01-04 52.02 9072 A 1009.188 0.02
Run Code Online (Sandbox Code Playgroud)
有没有替代方案 apply可以提高效率或至少是第二种做事方式!!
注意:我不是在谈论 dask 和其他并行化,只谈论纯熊猫。
必需:
在Pct_Change_Adjusted不使用应用的情况下计算列。
我一直在努力解决如何根据索引名称设置突出显示熊猫行的样式。我知道如何突出显示选定的行,但是当我必须根据索引突出显示时,代码不起作用。
设置
df = pd.DataFrame({'key': list('ABCD'), 'value': range(4)})
print(df)
key value
0 A 0
1 B 1
2 C 2
3 D 3
Run Code Online (Sandbox Code Playgroud)
当键值为“B”或“D”时突出显示行
# this works
df.style.apply(lambda x: ['background: lightgreen'
if (x.key == 'B' or x.key == 'D')
else '' for i in x], axis=1)
Run Code Online (Sandbox Code Playgroud)
根据索引名称突出显示行
# This DOES NOT work
df1 = df.set_index('key')
df1.style.apply(lambda x: ['background: lightgreen'
if (x.index == 'B' or x.index == 'D')
else '' for i in x], axis=1)
Run Code Online (Sandbox Code Playgroud)
如何根据索引名称突出显示行?
我在 google colaboratory 中使用 catboost 模块对提升分类器进行建模。我遵循了官方示例:
from catboost import CatBoostClassifier, Pool
train_data = [[1, 3], [0, 4], [1, 7], [0, 3]]
train_labels = [1, 0, 1, 1]
model = CatBoostClassifier(learning_rate=0.03)
model.fit(train_data,
train_labels,
verbose=False,
plot=True)
Run Code Online (Sandbox Code Playgroud)
但这在 Google Colab notebook 中没有显示任何情节。
这是我的 google colab 代码:
from catboost import CatBoostClassifier, Pool
train_data = [[1, 3], [0, 4], [1, 7], [0, 3]]
train_labels = [1, 0, 1, 1]
model = CatBoostClassifier(learning_rate=0.03)
model.fit(train_data,
train_labels,
verbose=False,
plot=True)
Run Code Online (Sandbox Code Playgroud)
Google colab 只是打印,<catboost.core.CatBoostClassifier at 0x7fc7a846d898>而不是像 …
通常,当我们绘图时,绘图的底部(从左到右)有x轴,左边有y轴(从下到上).
例如,在R编程中,我有一个这样的代码:
t <- seq(0,1,0.2) # need t values in top x axis
plot(t,t^2,type="l") # need t^2 values in inverted y-axis
Run Code Online (Sandbox Code Playgroud)
现在,如果我们想要绘图使得x轴在顶部(从左到右)和y轴反转(从上到下).
我们怎样才能在R编程中实现这样的壮举?我在stackoverflow中搜索了以下链接,但是它们无法满足我的要求:
如何在绘图上反转y轴
使用网站上的说明:http:
//wiki.octave.org/Octave_for_MacOS_X
我在MacOS X 10.9.5上安装了八度音程.已安装的应用程序位于:
/Applications/Octave-cli.app
/Applications/Octave-gui.app
现在,我有一个名为example.m的八度脚本
%file: example.m
print('hello')
Run Code Online (Sandbox Code Playgroud)
如何从终端运行此文件?
NOTE:
open /Applications/Octave-cli.app # this works fine
open /Applications/Octave-gui.app # this freezes the octave program
Run Code Online (Sandbox Code Playgroud)
然后我可以交互式编写和运行八度命令.
我想要的是:
octave myexample.m
Run Code Online (Sandbox Code Playgroud)
应该给出结果,如同python myscript.py给出的那样.
更新:
我卸载了:
/Applications/Octave-cli.app和/Applications/Octave-gui.app
然后,我下载了两个
带有图形用户界面(OS X 10.9+)的Octave 4.0.2 下载应用程序,
下载带命令行界面的Octave 4.0.2(OS X 10.9+)
来自网站:
http:
//wiki.octave.org/Octave_for_MacOS_X然后,我得到Octave.app,我可以在该图形界面中编写和运行八度脚本.
但是,我也想从命令行运行:
octave myexample.m
Run Code Online (Sandbox Code Playgroud)
一些相关的链接如下:
如何在unix shell中调用八度脚本
我需要检查df.head()和df.tail()多次。使用df.head(), df.tail()jupyter notebook 时会显示丑陋的输出。
是否有任何单行命令,以便我们只能选择前 5 行和后 5 行:
就像是:
df.iloc[:5 | -5:] ?
测试示例:
df = pd.DataFrame(np.random.rand(20,2))
df.iloc[:5]
Run Code Online (Sandbox Code Playgroud)
更新
丑陋但有效的方法:
df.iloc[(np.where( (df.index < 5) | (df.index > len(df)-5)))[0]]
or,
df.iloc[np.r_[np.arange(5), np.arange(df.shape[0]-5, df.shape[0])]]
Run Code Online (Sandbox Code Playgroud) 我有一张这样的表:
+-------+-----+------+------+
|user_id|apple|good banana|carrot|
+-------+-----+------+------+
| user_0| 0| 3| 1|
| user_1| 1| 0| 2|
| user_2| 5| 1| 2|
+-------+-----+------+------+
Run Code Online (Sandbox Code Playgroud)
在这里,对于每个水果,我想获取购买最多商品的客户列表。所需的输出如下:
max_user max_count
apple [user_2] 5
banana [user_0] 3
carrot [user_1, user_2] 2
Run Code Online (Sandbox Code Playgroud)
+-------+-----+------+------+
|user_id|apple|good banana|carrot|
+-------+-----+------+------+
| user_0| 0| 3| 1|
| user_1| 1| 0| 2|
| user_2| 5| 1| 2|
+-------+-----+------+------+
Run Code Online (Sandbox Code Playgroud)
如何使用 Pyspark 获得所需的输出?
如何使用 Pyspark sql 获取所需的输出?
我已经做了一些研究并搜索了多个页面。到目前为止,我已经想出了一个接近的答案,但它需要转置表,这里我的表是正常的。另外,我正在学习多种方法,例如 Spark 方法和 SQL 方法。
Pandas apply 一般建议不要使用。我在这里遇到一种情况,我感兴趣是否有更有效的替代方案来选择 apply 。
import numpy as np
import pandas as pd
df = pd.DataFrame({'year': [1990,1990,1990,1992,1992,1992,1992,1993,1993,1993],
'item': list('abcdefghij'),
'value': [100,200,300,400,500,600,700,800,900,990]})
df
Run Code Online (Sandbox Code Playgroud)
我想获得每年的前 2 个值。
df.groupby('year')['value'].apply(lambda x: x.nlargest(2)).reset_index()
Run Code Online (Sandbox Code Playgroud)
有什么替代方案吗?任何东西,无论是更长的代码行还是其他什么!
我正在同时学习 Pandas 和 R 并想知道是否有任何方法可以在 Pandas 中进行跟踪?
y = c(3,2,2,NA,30,4)
ntile(y, n=2) # 1 1 1 NA 2 2
Pandas
y = pd.Series((3,2,2,np.nan,30,4))
??
Explanation:
From: (3,2,2,NA,30,4)
To: 1 1 1 np.nan 2 2
Logic: first three number are smaller in rank and assign rank 1
last two values are larger so have rank 2.
**Required Output**
array([1 1 1 nan 2 2])
Run Code Online (Sandbox Code Playgroud)