python - 如何在熊猫的列中间添加字符串
问题描述
我正在寻找一种不涉及 .apply 或 lambda 函数的解决方案,该函数循环遍历列表并在所需索引处添加字符串。我有一个这样的专栏,里面有很多条目:
df = pd.DataFrame(["1:77631829:-:1:77641672:-"], columns=["position"])
position
0 1:77631829:-:1:77641672:-
我想要:
position
0 chr1:77631829:-:chr1:77641672:-
所以在开头和第三个冒号之后插入“chr”:
我会认为这样的事情会做,但插入还没有连续实现:
"chr" + df["position"].str.split(":").insert(3, "chr").str.join(":")
这样做,但看起来效率低下:
"chr" + df["position"].str.split(":").str[:3].str.join(":") + "chr" + df["position"].str.split(":").str[3:].str.join(":")
解决方案
我认为您可以使用按3
值拆分:
,然后提取列表的头部和尾部 - 加入头部,添加ch
到尾部,前置ch
和最后追加到列表L
:
df = pd.DataFrame(["1:77631829:-:1:77641672:-","1:77631829:-:1:77641672:-"],
columns=["position"])
print (df)
position
0 1:77631829:-:1:77641672:-
1 1:77631829:-:1:77641672:-
L = []
for x in df["position"]:
*i, j = x.split(':', 3)
L.append(("chr" + ':'.join(i) + "chr" + j))
df['new'] = L
print (df)
position new
0 1:77631829:-:1:77641672:- chr1:77631829:-chr1:77641672:-
1 1:77631829:-:1:77641672:- chr1:77631829:-chr1:77641672:-
带有评论的破解解决方案:
'chr' + df['position'].str.replace('-:', '-:chr')
使用列表理解和 f 字符串更快:
df['new'] = [f"ch{x.replace('-:', '-:chr')}" for x in df['position']]
性能:
df = pd.DataFrame(["1:77631829:-:1:77641672:-","1:77631829:-:1:77641672:-"],
columns=["position"])
#[20000 rows x 1 columns]
df = pd.concat([df] * 10000, ignore_index=True)
In [226]: %%timeit
...: L = []
...: for x in df["position"]:
...: *i, j = x.split(':', 3)
...: L.append(("chr" + ':'.join(i) + "chr" + j))
...:
...: df['new1'] = L
...:
18.9 ms ± 1.25 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [227]: %%timeit
...: df['new2'] = "chr" + df["position"].str.split(":").str[:3].str.join(":") + "chr" + df["position"].str.split(":").str[3:].str.join(":")
...:
50.8 ms ± 1.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [228]: %%timeit
...: df['new3'] = 'chr' + df['position'].str.replace('-:', '-:chr')
...:
21.5 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [229]: %%timeit
...: df['new4'] = [f"ch{x.replace('-:', '-:chr')}" for x in df['position']]
...:
8.59 ms ± 130 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
推荐阅读
- php - 第二次登录失败后如何启动 Laravel 锁定计数器
- c - 在 AIX 上编译 c 程序时出错 - “ld: 0711-317 ERROR: Undefined symbol: .iconv_open”
- cqrs - 应如何在使用 CQRS 的事件溯源中实现使用标准的搜索
- c# - 从 MDB 文件插入 SQL
- android - kotlin.jvm.functions.Function1不能在没有@Provides-annotated 方法的情况下提供
- mysql - MySql ODBC 连接器 3.1.14 和 mariaDB ;int 列为零
- kubernetes - 如果已经有作业在运行,如何防止在 Kubernetes 中执行 Cronjob?concurrencyPolicy:Forbid 完全停止 cron 作业执行
- generics - 如何获取变量的类型,以便调用 turbofish 函数?
- reactjs - 如何在 React 中单击时显示组件?
- flutter - 使用另一种方法查看每个项目检查