sql截取字符串,作为表的行和列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql截取字符串,作为表的行和列相关的知识,希望对你有一定的参考价值。
参考技术A sqlserver中一般用substring来截取字符,mysql中用substr和substring较多,access中一般用mid。上述函数基本类似:
以substr为例
substr
(str,
pos)
由
中,选出所有从第
位置开始的字元。请注意,这个语法不适用于
sql
server
上。
substr
(str,
pos,
len)
由
中的第
位置开始,选出接下去的
个字元。
Pandas:使用大文件的行和列的条件优化迭代
【中文标题】Pandas:使用大文件的行和列的条件优化迭代【英文标题】:Pandas: optimise iterating with a condition on both row and column with large file 【发布时间】:2021-04-01 13:48:36 【问题描述】:我有以下数据,我希望只有在满足以下条件时,才在col D中用另一行(我们称之为目标行)的值填充col E:
col E 没有值 目标行col A中的字符串与col A中的字符串相同 目标行的 col B 中的值与 col C 中的值相同A | B | C | D | E | |
---|---|---|---|---|---|
1 | XXZ | a | d | 1 | |
2 | YXXZ | b | a | 2 | |
3 | YXXZ | c | b | 3 | 2 |
4 | YXXZ | d | c | 4 | 5 |
5 | XXZ | e | a | 4 |
我会得到这样的东西:
A | B | C | D | E |
---|---|---|---|---|
XXZ | a | d | 1 | 1 |
YXXZ | b | a | 2 | 2 |
YXXZ | c | b | 3 | 2 |
YXXZ | d | c | 4 | 5 |
XXZ | e | a | 4 | NaN |
下面@ralubrusto 的答案有效,但对于大文件显然效率不高。有什么建议可以让它更快地工作吗?
missing = df.E.isna()
for id in df[missing].index:
original = df.loc[id]
# Second condition
equal_A = df[df['A'] == original['A']]
# Third condition
the_one = equal_A[equal_A['C'] == original['B']]
# Assigning
if len(the_one) > 0:
df.at[id, 'E'] = the_one.iloc[0]['D']
【问题讨论】:
我完全听不懂你的指示... 我已经改写了。是不是更清楚了? 什么是目标行? 我想从中提取 col D 值的行 的。为什么要放在第 2、2 行 【参考方案1】:由于您有多个不同的条件,您可能想要执行以下操作:
# Find missing E values
missing = df.E.isna()
for id in df[missing].index:
original = df.loc[id]
# Second condition
equal_A = df[df['A'] == original['A']]
# Third condition
the_one = equal_A[equal_A['C'] == original['B']]
# Assigning
if len(the_one) > 0:
df.at[id, 'E'] = the_one.iloc[0]['D']
您的示例数据的答案是:
A B C D E
0 XXZ a d 1 4.0
1 YXXZ b a 2 3.0
2 YXXZ c b 3 2.0
3 YXXZ d c 4 5.0
4 XXZ e a 4 NaN
编辑:感谢您的耐心等待。我尝试了几种不同的方法来完成这项任务,但其中大多数方法效率很低,正如您在下面的 perfplot
中看到的那样(这不是一个完美的情节,但您可以大致了解一下)。
我尝试了一些方法,使用 groupby
、apply
、for
循环(上一个答案),最后是 merge
一个,这是迄今为止最快的一个。
这是它的代码:
_df = (df.reset_index()
.merge(df, left_on=['A', 'B'],
right_on=['A', 'C'],
how='inner',
suffixes=['_ori', '_target']))
_df.loc[_df.E_ori.isna(), 'E_ori'] = _df.loc[_df.E_ori.isna(), 'D_target']
_df.set_index('index', inplace=True)
df.loc[_df.index, 'E'] = _df['E_ori']
它确实比以前的解决方案更有效,所以请使用您的数据集尝试一下,如果您还有其他问题,请告诉我们。
【讨论】:
非常感谢。我刚刚尝试了您的解决方案。我没有收到错误,但它已经运行了几分钟以上。你认为30mb以下的csv正常吗? 确实——我已经把它放了一夜了,它甚至无法通过一个 1GB 的文件。有没有一种计算效率更高的方法来做到这一点? @Alexisargentine 感谢您的耐心等待。请看一下编辑后的答案以上是关于sql截取字符串,作为表的行和列的主要内容,如果未能解决你的问题,请参考以下文章