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