首页 > 解决方案 > 查找熊猫数据框中列之间的父子关系

问题描述

我有一个类似于下面结构的熊猫数据框。我想找出列之间的父子关系,即Col1是父子关系Col2Col2是父子关系,Col3意思是一个值Col1可以有多个值,Col2并且同样适用于Col2Col3。一开始我不知道什么是什么。所以我需要动态地弄清楚这种关系。

Col1    Col2    Col3
a       b       d
a       b       d
a       b       e
a       c       e
a       c       f
a       c       f
b       c       g
b       c       g
c       c       g
c       c       g
c       c       g
c       b       g
d       c       g
d       c       h
d       b       h

通过父子关系,我的意思是 Col1 值a有多个 Col2 值,即b,c反对它。

是否有某种公式可以用来找出这个问题?

预期的输出可以是一个列名数组,如下所示。

['Col1', 'Col2', 'Col3']

第一个索引是最父列,而最后一个索引是最子列。

谢谢。

标签: pythonpandas

解决方案


能够使用以下代码获得预期的结果。

def _row_value_changed(row: Any, col1: str, col2: str) -> int:   
    if row[col1] == row[col1 + "_shifted"] and row[col2] != row[col2 + "_shifted"]:
        return 1
    return 0

shifted_df = df.shift(periods=-1)
shifted_df.columns = [str(col) + "_shifted" for col in shifted_df.columns]
df2 = pd.concat([df, shifted_df], axis=1)[0:5000]
df2["change"] = df2.apply(
    row_value_changed, args=('Col1', 'Col2'), axis=1
)
df2["change"].sum()

代码执行以下操作。

  1. 创建一个新的数据框(shifted_df),每行向上移动。
  2. 附加_shifted到列名以区分原始数据框和移动的数据框列名。
  3. 将原始数据框的列与新移动的列合并为一个大数据框(df2)
  4. df2在名为的新列中创建一个change。如果Col2值相对于 更改,则该列将被分配值 1 Col1
  5. Col2对更改列求和,以找出相对于 更改了多少次Col1

如果我们在切换参数的情况下再次调用以下行。

df2["change"] = df2.apply(
    row_value_changed, args=('Col2', 'Col1'), axis=1
)

Col1比我们可以计算出相对于 改变了多少次Col2。这可以帮助我们比较并找出哪一列相对于另一列发生了变化。


推荐阅读