如何在pandas中将多个相同类别的行组合成一个?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在pandas中将多个相同类别的行组合成一个?相关的知识,希望对你有一定的参考价值。
答案
您可以使用列中的值填充空值并删除重复项:
用:
df = pd.DataFrame([["A", pd.np.nan, pd.np.nan, "Y", "Z"],
[pd.np.nan, "B", pd.np.nan, "Y", "Z"],
[pd.np.nan,pd.np.nan, "C", "Y", "Z"]], columns=list("ABCDE"))
df
A B C D E
0 A NaN NaN Y Z
1 NaN B NaN Y Z
2 NaN NaN C Y Z
df.ffill().bfill().drop_duplicates()
A B C D E
0 A B C Y Z
df.ffill().bfill()
给出:
A B C D E
0 A B C Y Z
1 A B C Y Z
2 A B C Y Z
根据您的注释,您可以定义一个函数,该函数通过位于同一列中其他位置的唯一值来填充第一行的缺失值。
def fillna_uniq(df, col):
if isinstance(col, list):
for c in col:
df.loc[df.index[0], c] = df[c].dropna().iloc[0]
else:
df.loc[df.index[0], col] = df[col].dropna().iloc[0]
return df.iloc[[0]]
然后你可以这样做:
fillna_uniq(df.copy(), ["B", "C", "D"])
A B C D E F
0 Hello I am lost Pandas Data
我觉得它快一点。您可以通过直接传递数据帧而不是副本来修改您的df。
HTH
另一答案
一种方法是使用apply
和dropna
:
假设上表中的那些空白实际上是空的:
df = pd.DataFrame({'A':['Hello',np.nan,np.nan,np.nan],'B':[np.nan,'I',np.nan,np.nan],
'C':[np.nan,np.nan,'am',np.nan],
'D':[np.nan,np.nan,np.nan,'lost'],
'E':['Pandas']*4,
'F':['Data']*4})
print(df)
A B C D E F
0 Hello NaN NaN NaN Pandas Data
1 NaN I NaN NaN Pandas Data
2 NaN NaN am NaN Pandas Data
3 NaN NaN NaN lost Pandas Data
使用apply
,您可以将lambda函数应用于数据帧的每一列,首先删除空值然后找到max:
df.apply(lambda x: x.dropna().max()).to_frame().T
A B C D E F
0 Hello I am lost Pandas Data
或者,如果你的空白是空字符串,那么你可以这样做:
df1 = df.replace(np.nan,'')
df1
A B C D E F
0 Hello Pandas Data
1 I Pandas Data
2 am Pandas Data
3 lost Pandas Data
df1.apply(lambda x: x[x!=''].max()).to_frame().T
A B C D E F
0 Hello I am lost Pandas Data
以上是关于如何在pandas中将多个相同类别的行组合成一个?的主要内容,如果未能解决你的问题,请参考以下文章
将 loc 代码行组合成 1 个函数 python pandas