【问题标题】:Update row index when all columns of the next row ara NaN in a Pandas DataFrame当 Pandas DataFrame 中下一行的所有列都为 NaN 时更新行索引
【发布时间】:2020-07-15 14:41:43
【问题描述】:

我有一个从带有tabula-py 的 PDF 中提取的 Pandas DataFrame。

PDF是这样的:

+--------------+--------+-------+
|     name     | letter | value |
+--------------+--------+-------+
| A short name | a      |     1 |
+-------------------------------+
| Another      | b      |     2 |
+-------------------------------+
| A very large | c      |     3 |
| name         |        |       |
+-------------------------------+
| other one    | d      |     4 |
+-------------------------------+
| My name is   | e      |     5 |
| big          |        |       |
+--------------+--------+-------+

如您所见,A very large name 有一个换行符,并且由于原始 pdf 没有边框,因此在 DataFrame 中创建了一行 ['name', NaN, NaN] 和另一行 ['A very large', 'c', 3],当我只想要一个时内容:['A very large name', 'c', 3]

My name is big 也是如此

当这行中的其余单元格为NaN 时,我试图将name 单元格的内容与前一个单元格连接起来。然后删除 NaN 行。

但任何其他获得相同结果的策略都是受欢迎的。

import pandas as pd
import numpy as np

data = {
    "name": ["A short name", "Another", "A very large", "name", "other one", "My name is", "big"],
    "letter": ["a", "b", "c", np.NaN, "d", "e", np.NaN],
    "value": [1, 2, 3, np.NaN, 4, 5, np.NaN],
}
df = pd.DataFrame(data)

data_expected = {
    "name": ["A short name", "Another", "A very large name", "other one", "My name is big"],
    "letter": ["a", "b", "c", "d", "e"],
    "value": [1, 2, 3, 4, 5],
}

df_expected = pd.DataFrame(data_expected)

我正在尝试这样的代码,但无法正常工作

# Not works and not very `pandastonic`
nan_indexes = df[df.iloc[:, 1:].isna().all(axis='columns')].index 
df.loc[nan_indexes - 1, "name"] = df.loc[nan_indexes - 1, "name"].str.cat(df.loc[nan_indexes, "name"], ' ')

# remove NaN rows



【问题讨论】:

    标签: pandas pdf tabula


    【解决方案1】:

    您可以尝试使用groupby.aggjoinfirst,具体取决于列。通过检查列字母和值中的notnacumsum 来创建组。

    print (df.groupby(df[['letter', 'value']].notna().any(1).cumsum())
             .agg({'name': ' '.join, 'letter':'first', 'value':'first'})
          )
                    name letter  value
    1       A short name      a    1.0
    2            Another      b    2.0
    3  A very large name      c    3.0
    4          other one      d    4.0
    5     My name is big      e    5.0
    

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2017-09-15
      • 1970-01-01
      • 2021-03-21
      • 2022-01-20
      • 2020-02-01
      • 2014-03-30
      • 1970-01-01
      • 2019-05-24
      相关资源
      最近更新 更多