Pandas 当数据帧中下一行的所有列都为NaN时更新行索引

Pandas 当数据帧中下一行的所有列都为NaN时更新行索引,pandas,pdf,tabula,Pandas,Pdf,Tabula,我有一个从PDF中提取的熊猫数据框 PDF格式如下: +--------------+--------+-------+ | name | letter | value | +--------------+--------+-------+ | A short name | a | 1 | +-------------------------------+ | Another | b | 2 | +------------------

我有一个从PDF中提取的熊猫数据框

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          |        |       |
+--------------+--------+-------+
正如您所看到的,
一个非常大的名称
有一个换行符,并且由于原始pdf没有边框,所以在数据框中创建了一行
['name',NaN,NaN]
,另一行
['A very large',c',3]
,而我只需要一行内容:
['A very large name',c',3]

我的名字很大

当我试图实现的几行出现这种情况时,当行中的其余单元格为
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




您可以尝试使用
groupby.agg
join
first
,具体取决于列。通过检查字母和值列中的
notna
位置和
cumsum
来创建组

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

您可以尝试使用
groupby.agg
join
first
,具体取决于列。通过检查字母和值列中的
notna
位置和
cumsum
来创建组

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