Python按两个列值的相反排序顺序按Groupby连接两个数据框

标签 python pandas dataframe group-by

我有两个数据帧,我想使用 groupby 计算两列之间的差异,因此对于 df1 groupby ColA & ColB 并排序 ColD assending,将 df2 与 groupby ColA2 & ColB2 连接并排序 ColD dessending,并将 df2 匹配到 df1与 df2 的 ColD2 信息。预先感谢您。

DF 1

  colA   ColB    ColD
     A    3H1     150
     A    3H1     550   
     A    HYT     250
     B    3H1     350
     B    3H1     450
     B    8YT     750
     C    8YT    1050
     C    8YT     450
     C    3H1     250
     C    8YT     550
     C    8YT     750
     C    3H1     650

DF 2

  colA2  ColB2   ColD2   ColC2
     A    3H1     500      A50
     A    3H1     600      B50
     A    HYT     300      G60
     B    3H1     500      T67
     B    3H1    1500      H63
     B    8YT     800      K72
     C    8YT     700      Y23
     C    8YT     400      O98
     C    3H1     200      Y11
     C    8YT     500      A78
     C    8YT     700      H23

输出:基本上保留 df1 数据帧,并让 df2 加入 groupby ColA 和 ColB,将 ColD2 重新排序为 ColD 的排序(ColD 上行,ColD2 下行),并让 df2 的 ColC2 加入。

  colA   ColB    ColD    ColD2    ColC2
     A    3H1     150     600      B50
     A    3H1     550     500      A50
     A    HYT     250     300      G60
     B    3H1     350    1500      H63
     B    3H1     450     500      T67
     B    8YT     750     800      K72
     C    8YT     450     700      H23
     C    8YT     550     700      Y23
     C    3H1     250     200      Y11
     C    8YT     750     500      A78
     C    8YT    1050     400      O98
     C    3H1     650     na       na

最佳答案

尝试:

df2 = df2.sort_values(by=["colA2", "ColB2", "ColD2"], ascending=[True, True, False])

df1["tmp"] = df1.groupby(["colA", "ColB"]).cumcount().values
df2["tmp"] = df2.groupby(["colA2", "ColB2"]).cumcount().values

x = df1.merge(
    df2, left_on=["colA", "ColB", "tmp"], right_on=["colA2", "ColB2", "tmp"], how="left"
)
print(x[["colA", "ColB", "ColD", "ColD2", "ColC2"]])

打印:

   colA ColB  ColD   ColD2 ColC2
0     A  3H1   150   600.0   B50
1     A  3H1   550   500.0   A50
2     A  HYT   250   300.0   G60
3     B  3H1   350  1500.0   H63
4     B  3H1   450   500.0   T67
5     B  8YT   750   800.0   K72
6     C  8YT  1050   700.0   Y23
7     C  8YT   450   700.0   H23
8     C  3H1   250   200.0   Y11
9     C  8YT   550   500.0   A78
10    C  8YT   750   400.0   O98
11    C  3H1   650     NaN   NaN

关于Python按两个列值的相反排序顺序按Groupby连接两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75239629/

相关文章:

python - 如何将 stdlib 日志记录与 py.test 结合起来

python - 使用 Python 获取列的两个值之间的行

python - 为什么在 Pandas 数据框中使用 Z-score 进行标准化会生成 NaN 列?

python - 在由现有列的值组成的数据框中创建一个新列

python - 基于其他行的过去值到当前值的新行

python - 机器学习: UserWarning: Pandas doesn't allow columns to be created via a new attribute name

python - 自动化无聊的事情 - 逗号代码 : Why doesn't my code work?

python - 线性回归不对称系数 - python 中的双 beta

python - 如何在条形图中按升序对条形进行排序?

python - 将 Pandas 时间序列数据集合并到数值最近的索引、全外连接、聚合列到最大值