如何在pandas中将多个相同类别的行组合成一个?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在pandas中将多个相同类别的行组合成一个?相关的知识,希望对你有一定的参考价值。

我试图从图1到表2从图像中获取,但我似乎无法做到正确。我尝试使用数据透视表将col A - D从行更改为cols。然后我尝试groupby但它不会给我一行但是会弄乱我的数据帧。

enter image description here

答案

您可以使用列中的值填充空值并删除重复项:

用:

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

另一答案

一种方法是使用applydropna

假设上表中的那些空白实际上是空的:

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中将多个相同类别的行组合成一个?的主要内容,如果未能解决你的问题,请参考以下文章

在 PrestoSQL 中将行组合成一个列表

将 loc 代码行组合成 1 个函数 python pandas

如何使用熊猫将多行组合成具有多条件的行[关闭]

基于其他列(即应用 CDC)将多个 spark 数据帧行组合成一个

将相同的行组聚合为一行

查找具有已定义结束的连续相同值的行组 (SQL Redshift)