从单行循环的 Dataframe 中提取字符串

Extract strings from a Dataframe looping over a single row

我正在将多个 PDF(使用表格)读取到数据框中,如下所示:

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)

dataframe figure

我的意图是将该值“330736 1”用于变量“数字”,将“30/09/2015”用于变量“日期”。

问题在于,虽然这些值始终位于第 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()

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

在您的原始代码中,if isinstance(df.iloc[1:2,i], str) 永远不会计算为 True,原因有两个:

  1. DataFrame 中的字符串类型为 object
  2. df.iloc[1:2,i] 将永远是一个 pandas 系列。

由于 object 是一种灵活的类型,它不如 str 用于识别您想要的数据。在下面的代码中,我简单地使用了一个 space 字符来区分您想要 n_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()