Python 连接数据帧中的空行

Python 连接数据帧中的空行,python,pandas,dataframe,Python,Pandas,Dataframe,我有如下数据框 Name ID Rank ============================== Jobn 0001 1 Wick Nan Nan John 0101 22 lewis Nan Nan James 0201 12 Bo Nan Nan nd Nan

我有如下数据框

Name         ID         Rank
==============================
Jobn        0001        1
Wick        Nan         Nan
John        0101        22
lewis       Nan         Nan
James       0201        12
Bo          Nan         Nan
nd          Nan         Nan
在这里,我需要根据ID和Rank值合并名称,如果是Nan,那么我必须在不同的行中合并名称,直到值不是Nan

输出如下所示

Name         ID         Rank
==============================
Jobn Wick       0001        1
John lewis      0101        22
James Bo nd     0201        12
我尝试了以下代码

for rowid in range(len(tableDf)):
    for colid in  range(len(tableDf.columns)):
        if pd.isna(tableDf.iloc[rowid,colid]):
            print(tableDf.iloc[rowid-1,colid])
            #print(type(tableDf.iloc[rowid - 1, colid]))
            if type(tableDf.iloc[rowid - 1, colid]) == str:
                print("got a string nan")
                # tableDf.at[rowid-1,colid] = str(tableDf.iloc[rowid-1,colid]) +   str(tableDf.iloc[rowid,colid])
            else:
                print("got a NON string nan")
                # tableDf.at[rowid - 1, colid] = tableDf.iloc[rowid - 1, colid] + tableDf.iloc[rowid, colid]

但是我不能合并行。有什么建议可以解决这个问题吗? 注意:列名不是固定的。它可能会更改。

我是这样做的:

df['ID'].fillna(method='ffill',inplace=True)
name_dict = {i:' '.join(df['Name'].loc[df['ID']==i].values) for i in df['ID'].unique()}
df['Name'] = df['ID'].apply(lambda x: name_dict[x])
df.dropna(axis=0,inplace=True)
您可以利用每个ID只有一行具有非空值,而不是合并行。然后您可以做的是将ID列向前填充,以便脚本知道要与哪些ID关联的字符串。然后,将名称映射回具有ID的所有行。现在,您将有许多名称重复的行,但每个名称只有一行的秩值不为空,因此您可以在列中删除任何具有空值的行。

我是这样做的:

df['ID'].fillna(method='ffill',inplace=True)
name_dict = {i:' '.join(df['Name'].loc[df['ID']==i].values) for i in df['ID'].unique()}
df['Name'] = df['ID'].apply(lambda x: name_dict[x])
df.dropna(axis=0,inplace=True)
您可以利用每个ID只有一行具有非空值,而不是合并行。然后您可以做的是将ID列向前填充,以便脚本知道要与哪些ID关联的字符串。然后,将名称映射回具有ID的所有行。现在,您将有许多行具有重复的名称,但每个名称只有一行的秩值不为空,因此您可以在列中删除任何具有空值的行。

IIUC


输出

          Name    ID Rank
0    Jobn Wick  0001    1
1   John lewis  0101   22
2  James Bo nd  0201   12
细节

print(blocks)
0    1
1    1
2    2
3    2
4    3
5    3
6    3
dtype: int64
编辑

如果您有“名称”列和许多其他列:

cols = df.columns.difference(['Name'])
blocks = df[cols].notna().all(axis=1).cumsum()
new_df = (df.groupby(blocks, as_index=False)
            .agg(dict({'Name': ' '.join}, **dict(zip(cols, ['first']*len(cols))))))
print(new_df)
          Name    ID Rank
0    Jobn Wick  0001    1
1   John lewis  0101   22
2  James Bo nd  0201   12

或者您可以使用:

cols = df.columns[1:]
blocks = df[cols].notna().all(axis=1).cumsum()
new_df = (df.groupby(blocks, as_index=False)
            .agg(dict({df.columns[0]: ' '.join}, **dict(zip(cols, ['first']*len(cols))))))
print(new_df)
          Name    ID Rank
0    Jobn Wick  0001    1
1   John lewis  0101   22
2  James Bo nd  0201   12
IIUC


输出

          Name    ID Rank
0    Jobn Wick  0001    1
1   John lewis  0101   22
2  James Bo nd  0201   12
细节

print(blocks)
0    1
1    1
2    2
3    2
4    3
5    3
6    3
dtype: int64
编辑

如果您有“名称”列和许多其他列:

cols = df.columns.difference(['Name'])
blocks = df[cols].notna().all(axis=1).cumsum()
new_df = (df.groupby(blocks, as_index=False)
            .agg(dict({'Name': ' '.join}, **dict(zip(cols, ['first']*len(cols))))))
print(new_df)
          Name    ID Rank
0    Jobn Wick  0001    1
1   John lewis  0101   22
2  James Bo nd  0201   12

或者您可以使用:

cols = df.columns[1:]
blocks = df[cols].notna().all(axis=1).cumsum()
new_df = (df.groupby(blocks, as_index=False)
            .agg(dict({df.columns[0]: ' '.join}, **dict(zip(cols, ['first']*len(cols))))))
print(new_df)
          Name    ID Rank
0    Jobn Wick  0001    1
1   John lewis  0101   22
2  James Bo nd  0201   12

列数可能会更改。为了简单起见,我在这里只添加了两列,大约有50列。请检查节编辑,您可以使用
pd.Index.difference
并以友好方式设置聚合dict
pandas.core.base.SpecificationError:不支持嵌套重命名程序
,获取错误。我检查了该错误,在名为聚合的新版本中,原因是推荐使用不推荐的“dict of dicts”方法替换列数可能会更改。为了简单起见,我在这里只添加了两列,大约有50列。请检查编辑部分,您可以使用
pd.Index.difference
并手动设置聚合dict
pandas.core.base.SpecificationError:不支持嵌套重命名器
,获取错误。我检查了该错误,建议使用名为aggregation的新pandas版本中的原因替换不推荐的“dict of dicts”方法