Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一行上循环的数据帧中提取字符串_Python_Pandas_Dataframe_Extract - Fatal编程技术网

Python 从一行上循环的数据帧中提取字符串

Python 从一行上循环的数据帧中提取字符串,python,pandas,dataframe,extract,Python,Pandas,Dataframe,Extract,我将多个PDF(使用tabla)读入如下数据帧: nan = float('nan') DataFrame_as_dict = {'Unnamed: 0': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan}, 'Unnamed: 1': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan}, 'NOTA DE NEGOCIAÇÃO': {0: nan, 1: nan, 2: 'Rico Inv

我将多个PDF(使用tabla)读入如下数据帧:

nan = float('nan')
DataFrame_as_dict = {'Unnamed: 0': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan},
 'Unnamed: 1': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan},
 'NOTA DE NEGOCIAÇÃO': {0: nan,
  1: nan,
  2: 'Rico Investimentos - Grupo XP',
  3: 'Av. Presidente Juscelino Kubitschek - Torre Sul, 1909 - 25o ANDAR VILA OLIMPIA 4543-907',
  4: 'Tel. 3003-5465Fax: (55 11) 4007-2465',
  5: 'Internet: www.rico.com.vc SAC: 0800-774-0402 e-mail: atendimento@rico.com.vc'},
 'Unnamed: 3': {0: 'Nr. nota Folha',
  1: '330736 1',
  2: nan,
  3: 'SÃO PAULO - SP',
  4: nan,
  5: nan},
 'Unnamed: 4': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan},
 'Unnamed: 5': {0: 'Data pregão',
  1: '30/09/2015',
  2: nan,
  3: nan,
  4: nan,
  5: nan}}

df = pd.DataFrame(DataFrame_as_dict)

我的意图是将该值“330736 1”用于变量“number”,将“30/09/2015”用于变量“date”

问题在于,尽管这些值始终位于第1行,列在多个PDF中以不可预测的方式变化

因此,我尝试循环第1行的不同列,以便提取这些数据,而不管它们是哪列:

list_columns = df.columns
for i in range(len(list_columns)):
    if isinstance(df.iloc[1:2,i], str):
        if df.iloc[1:2,i].str.contains("/",na=False,regex=False).any():
            date = str(df.iloc[1:2,i]).strip()
        else:
            n_nota = str(df.iloc[1:2,i]).strip()

然而,没有成功。。。有什么想法吗?

在您的原始代码中,
如果存在(df.iloc[1:2,i],str)
将永远不会计算为
True
,原因有二:

  • 数据帧内的字符串类型为
    object
  • df.iloc[1:2,i]
    将始终是一个系列
  • 由于
    object
    是一种非常灵活的类型,因此它在识别所需数据方面不如
    str
    有用。在下面的代码中,我只是使用了一个空格字符来区分
    n\u nota
    所需的数据。如果这不适用于您的数据,则正则表达式模式可能是一个好方法

    list_columns = df.columns
    for i in range(len(list_columns)):
        if isinstance(df.iloc[1:2,i].values, object):
            (df.iloc[1:2,i].values)
            if "/" in str(df.iloc[1:2,i].values):
                date = str(df.iloc[1:2,i].values[0]).strip()
            elif " " in str(df.iloc[1:2,i].values):
                n_nota = str(df.iloc[1:2,i].values[0]).strip()
    
    编辑:如下所述,如果将每个
    df.iloc[1:2,i]
    替换为
    df.iloc[1,i]
    ,则问题文本中的原始代码会起作用,如下所示:

    list_columns = df.columns
    for i in range(len(list_columns)):
        if isinstance(df.iloc[1,i], str):
            if df.iloc[1:2,i].str.contains("/",na=False,regex=False).any():
                date = str(df.iloc[1,i]).strip()
            else:
                n_nota = str(df.iloc[1,i]).strip()  
    

    你的代码运行得非常好。非常感谢你。然而,当你说“将永远不会评估为真”时,我认为会是这样,因为当我测试“print(isinstance(df.iloc[1,5],str))”时,它打印为真。啊,这在@Allan中是有意义的,并导致我在上面添加的更符合逻辑的解决方案,它几乎与你提出的解决方案相同。好极了!很明显,您就快到了,这个经过编辑的解决方案并不依赖于不太一般的空格字符。