【问题标题】:How to use variables (strings) with quotes and whitespace at the end inside query in Pandas?如何在 Pandas 的查询中使用带有引号和空格的变量(字符串)?
【发布时间】:2020-03-12 14:31:47
【问题描述】:

假设我有以下代码

    comm='This is/a string with (some single quotes, inside like 'F' this)'
print(df.query('Column1==@comm')['Column2'].values[0])

comm 存在于Column1 中时,这会给我一个错误而不是返回Column2 的值

我也试过了:

df.query("Column1=='{0}'".format(comm))['Column2'].values[0]

也没有运气。

如果变量是没有单引号 ' 或双引号 " 的字符串,它就可以正常工作。

在实际代码中,comm 是一个动态变量,它会更改并获取带有单 ' 和双 " 引号的字符串。

提前致谢。

编辑: 如果字符串包含符号,pandas 查询似乎会遇到各种其他问题。

我按照comm.replace("'","\\'") 的建议尝试并替换了包含单引号' 的字符串。

如果字符串末尾包含空格,我现在面临其他问题,即查询无法在数据框中找到字符串(即使字符串存在)。

comm='This is a test. string '
comm='This is a test string/ '

【问题讨论】:

  • 使用"Column1 == '@comm'"
  • 如果字符串中有单引号,则使用双引号将其分隔"like 'this'",反之亦然。
  • 效果不佳
  • 我使用的字符串可以有单引号和双引号。我还为变量尝试了三重单引号,但失败了。
  • 如果panda查询可以接受变量的三重单''',就没有问题了..但它不接受。

标签: python python-3.x pandas sqlite


【解决方案1】:

我看到你的字符串包含两者。

没问题:

comm = "string with \" and ' in it!"

【讨论】:

  • 没错,问题是在实际代码中,comm 是一个变量,它会更改并获取带有单个 ' 和双 " 引号的值字符串。
  • 问题出在哪里?
  • 您可以将每个 " 替换为 \"
  • 我发现这很不方便。必须有一个“干净”的方式。
  • 这完全没问题。但是,如果您需要这种方式,我需要更多地了解变量变化的方式。你从哪里得到的值,等等?
【解决方案2】:

你不能在单引号字符串中写单引号,因为你实际上所做的是将字符串分成两个字符串,留下语法错误

comm='This is/a string with (some single quotes, inside like ' +  F  + ' this)'

F 只是一个变量,现在不是字符串的一部分

这行代码运行良好

df = pd.DataFrame({'Column1': ["string with 'single' quotes,inside like 'F' this", 'Data'],
    'Column2':['Done','Data2']})
    comm="string with 'single' quotes,inside like 'F' this"
    print(df.query('Column1==@comm')['Column2'].values[0])

已编辑:- 您可以在单引号中使用单引号,方法是在其前面加上\'F\'

df = pd.DataFrame({'Column1': ['string with \'single\' quotes,inside like \'F\' this', 'Data'],
'Column2':['Done','Data2']})
comm='string with \'single\' quotes,inside like \'F\' this'
print(df.query('Column1==@comm')['Column2'].values[0])

这个技巧可以通过稍微改变格式来使查询适用于双引号格式。

import json 
def convert_string(string): #Function which change format to be '"<string>"'
    return json.dumps(string)

df = pd.DataFrame({'Column1': ['here', 'Data'],
'Column2':['Done','Data2']})
comm="here"
converted = convert_string(comm)
print(df.query('Column1=={}'.format(converted))['Column2'].values[0])

更好的解决方案是使用异常。

df = pd.DataFrame({'Column1': ['here', 'Data'],
'Column2':['Done','Data2']})
comm="here"
try:
    print(df.query('Column1==@comm')['Column2'].values[0])
except:
    print(df.query("Column1==@comm")['Column2'].values[0])

已编辑 - 2:

这个脚本可以非常快速地从数据框中删除所有符号。

#Create random dataframe
import pandas as pd
import numpy as np
import random
import string

random.seed(0)

def random_String(Length=20):
    letters = string.ascii_lowercase + string.punctuation
    return ''.join(random.choice(letters) for i in range(Length))
data_shape = 100000
data = {'A':[random_String() for i in range(data_shape)],'B':['Here string {}'.format(i) for i in range(data_shape)]}
df = pd.DataFrame(data)

df.head()
输出[1]:
                      甲乙
0 {y[}!cq'&z]`t%w,~n'i 这里是字符串 0
1 si[g.^q)>^-~jtg?e~{_];/a.&_|vp?u>|这里是字符串 3
4 em+op^j^)#ffu}'&gt*s 这里是字符串 4
def remove_symbols(s): #Function remove symbols from gived column
    return s.translate(str.maketrans('', '', string.punctuation))
def convert_data(pandas_series):
     return pandas_series.apply(remove_symbols)
df['A'] = convert_data(df['A'])
df.head()
输出[2]:
             甲乙
0 ycqztwni 这里是字符串 0
1 sigqjtge 这里是字符串 1
2 vgwunqda 这里是字符串 2
3 fzavpu 这里字符串 3
4 emopjffugts 这里是字符串 4

【讨论】:

  • 我将编辑我的帖子。问题在于,在实际代码中,comm 是一个动态变量,它会更改并获取带有单个 ' 和双 " 引号的值字符串
  • @Codeburn 我编辑了解决方案,如果仍然不能解决问题,请发布您的这部分代码
  • Lukas Nießen 已经建议了这一点。但是正如我回答的那样,数据框是从我不能编辑的 sqlite 中获取的。所以我必须基于第一个数据框创建一个新的数据框,我将用\'" 替换'\",以便我可以正确查询数据框。与使用三重 ''' 代码作为变量相比,这感觉像是一种不便 - 肮脏的方式。我希望有人会提出其他建议,否则我不得不使用这种“肮脏”的方式。
  • 不需要创建一个新的数据框,如果你在查询中使用单引号,你可以编写将@comm变量转换为所需格式的函数,写哪个函数将任何单引号字符串转换为双引号
  • 我试过json方案,速度太慢,不能用。
猜你喜欢
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 2021-01-06
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多