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 中看到的那样(这不是一个完美的情节,但您可以大致了解一下)。

我尝试了一些方法,使用 groupbyapplyfor 循环(上一个答案),最后是 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截取字符串,作为表的行和列的主要内容,如果未能解决你的问题,请参考以下文章

Qt 中如何实现换行和空格之间字符串的截取,本人新手,求大神指导!本人一定重谢!

oracle 按字符串截取字段

SQL如何查询表中某一列中的数据的前几位

解析 JSON 并绑定到动态创建的 HTML 表的行和列

关于pandas处理数据,怎么提取某一列的部分数字

Linux提取不匹配字符串的行和列(awk函数)