熊猫:将条件与条件合并

问题描述 投票:2回答:1

我有一个pandas DataFrame,下一列 - “A”,“B”,“C”,“D”。我想合并具有以下条件的DataFrame的行 -

如果我的DataFrame被调用df:

(df.at[i,"A"] == df.at[j, "B"]) and (df.at[j,"A"] == df.at[i,"B"])

例如 -

df = pd.DataFrame([[1,2,10,0.55],[3,4,5,0.3],[2,1,2,0.7]], columns=["A","B","C","D"]) 

这使 -

In [93]: df                                                                                                                                     
Out[93]: 
   A  B   C     D
0  1  2  10  0.55
1  3  4   5  0.30
2  2  1   2  0.70

在上面的示例中,行0和2具有条件。我确信最多可以有2行符合这个条件。对于具有此条件的行,我想将“C”值相加,平均“D”并删除冗余行。在上面的例子中我想得到 -

In [95]: result                                                                                                                                     
Out[95]: 
   A  B   C      D
0  1  2  12  0.625
1  3  4   5  0.300

要么

In [95]: result                                                                                                                                     
Out[95]: 
   A  B   C      D
0  2  1  12  0.625
1  3  4   5  0.300

我尝试了以下非常慢的代码:

def remove_dups(path_to_df: str):
    df = pd.read_csv(path_to_df)
    for i in range(len(df)):
        a = df.at[i, "A"]
        b = df.at[i, "B"]
        same_row = df[(df["A"] == b) & (df["B"] == a)]
        if same_row.empty:
            continue
        c = df.at[i, "C"]
        d = df.at[i, "D"]
        df.drop(i, inplace=True)
        new_ind = same_row.index[0]
        df.at[new_ind, "C"] += c
        df.at[new_ind, "D"] = (df.at[new_ind, "D"] + distance) / 2
    return df

有没有办法只使用内置的Pandas功能来实现这一目的?

python pandas
1个回答
2
投票

首先使用numpy.sort,然后使用GroupBy.agg

df[['A','B']] = np.sort(df[['A','B']], axis=1)

df = df.groupby(['A','B'], as_index=False).agg({'C':'sum', 'D':'mean'})
print (df)
   A  B   C      D
0  1  2  12  0.625
1  3  4   5  0.300

如果原始值无法更改:

arr = np.sort(df[['A','B']], axis=1)

df = (df.groupby([arr[:, 0],arr[:, 1]])
       .agg({'C':'sum', 'D':'mean'})
       .rename_axis(('A','B'))
       .reset_index())
print (df)
   A  B   C      D
0  1  2  12  0.625
1  3  4   5  0.300
© www.soinside.com 2019 - 2024. All rights reserved.