python - 相当于 cuDF 中的 pd.Series.str.slice() 和 pd.Series.apply()
问题描述
我想将以下代码(在 pandas 中运行)转换为在 cuDF 中运行的代码。
来自被操作系列的样本数据.head()
被插入到第 3 个代码单元格中的 OG 代码中——应该能够复制/粘贴运行。
熊猫中的原始代码
# both are float columns now
# rawcensustractandblock
s_rawcensustractandblock = df_train['rawcensustractandblock'].apply(lambda x: str(x))
# adjust/set new tract number
df_train['census_tractnumber'] = s_rawcensustractandblock.str.slice(4,11)
# adjust block number
df_train['block_number'] = s_rawcensustractandblock.str.slice(start=11)
df_train['block_number'] = df_train['block_number'].apply(lambda x: x[:4]+'.'+x[4:]+'0' )
df_train['block_number'] = df_train['block_number'].apply(lambda x: int(round(float(x),0)) )
df_train['block_number'] = df_train['block_number'].apply(lambda x: str(x).ljust(4,'0') )
被操纵的数据
# series of values from df_train.['rawcensustractandblock'].head()
data = pd.Series([60371066.461001, 60590524.222024, 60374638.00300401,
60372963.002002, 60590423.381006])
调整代码以从该示例数据开始
这是使用上面提供的数据而不是整个数据框时代码的外观。
根据尝试转换时遇到的错误,此问题属于系列级别,因此将下面的单元格转换为在 cuDF 中执行应该可以解决问题。
import pandas as pd
# series of values from df_train.['rawcensustractandblock'].head()
data = pd.Series([60371066.461001, 60590524.222024, 60374638.00300401,
60372963.002002, 60590423.381006])
# how the first line looks using the series
s_rawcensustractandblock = data.apply(lambda x: str(x))
# adjust/set new tract number
census_tractnumber = s_rawcensustractandblock.str.slice(4,11)
# adjust block number
block_number = s_rawcensustractandblock.str.slice(start=11)
block_number = block_number.apply(lambda x: x[:4]+'.'+x[4:]+'0' )
block_number = block_number.apply(lambda x: int(round(float(x),0)) )
block_number = block_number.apply(lambda x: str(x).ljust(4,'0') )
预期变化(输出)
df_train['census_tractnumber'].head()
# out
0 1066.46
1 0524.22
2 4638.00
3 2963.00
4 0423.38
Name: census_tractnumber, dtype: object
df_train['block_number'].head()
0 1001
1 2024
2 3004
3 2002
4 1006
Name: block_number, dtype: object
解决方案
您几乎可以将 cuDF 字符串方法(通过 nvStrings)用于您尝试执行的所有操作。将这些浮点数转换为 cuDF 中的字符串会丢失一些精度(尽管在上面的示例中可能无关紧要),因此对于这个示例,我只是事先进行了转换。如果可能,我建议最初将其创建rawcensustractandblock
为字符串列而不是浮点列。
import cudf
import pandas as pd
gdata = cudf.from_pandas(pd_data.astype('str'))
tractnumber = gdata.str.slice(4,11)
blocknumber = gdata.str.slice(11)
blocknumber = blocknumber.str.slice(0,4).str.cat(blocknumber.str.slice(4), '.')
blocknumber = blocknumber.astype('float').round(0).astype('int')
blocknumber = blocknumber.astype('str').str.ljust(4, '0')
tractnumber
0 1066.46
1 0524.22
2 4638.00
3 2963.00
4 0423.38
dtype: object
blocknumber
0 1001
1 2024
2 3004
3 2002
4 1006
dtype: object
推荐阅读
- angular - AOT Prod 构建:延迟加载不起作用。Angular 4.2 + 错误:找不到模块
- kubernetes - jx step helm apply 是否应该创建/生成 helm release
- arrays - 发出变量不将数组从子级传递给父级?
- c# - C# Mvc ajax baseUrl
- google-chrome - onInstalled 在移动设备上打开空白新标签
- ibm-mobilefirst - Mobilefirst 迁移数据库种类
- javascript - 嵌套路由反应路由器 4
- excel - 使用 VBA 将电子表格保存为 *.csv 时出现问题
- laravel - 如何在标签刀片模板中创建增量 1?
- firebase - 如何在firebase中过滤多个条件