python - 查找熊猫数据框中列之间的父子关系
问题描述
我有一个类似于下面结构的熊猫数据框。我想找出列之间的父子关系,即Col1
是父子关系Col2
,Col2
是父子关系,Col3
意思是一个值Col1
可以有多个值,Col2
并且同样适用于Col2
和Col3
。一开始我不知道什么是什么。所以我需要动态地弄清楚这种关系。
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']
第一个索引是最父列,而最后一个索引是最子列。
谢谢。
解决方案
能够使用以下代码获得预期的结果。
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()
代码执行以下操作。
- 创建一个新的数据框
(shifted_df)
,每行向上移动。 - 附加
_shifted
到列名以区分原始数据框和移动的数据框列名。 - 将原始数据框的列与新移动的列合并为一个大数据框
(df2)
。 df2
在名为的新列中创建一个change
。如果Col2
值相对于 更改,则该列将被分配值 1Col1
。Col2
对更改列求和,以找出相对于 更改了多少次Col1
。
如果我们在切换参数的情况下再次调用以下行。
df2["change"] = df2.apply(
row_value_changed, args=('Col2', 'Col1'), axis=1
)
Col1
比我们可以计算出相对于 改变了多少次Col2
。这可以帮助我们比较并找出哪一列相对于另一列发生了变化。
推荐阅读
- python - Heroku deploy successful but i get application error
- amazon-web-services - Terraform import identifying resource has been deleted but it hasn't
- firebase - Firestore 中的快照侦听器指标究竟是如何工作的?
- php - WordPress removes special characters from a HTML form submissions
- python - Call Class inside unittest class Python
- react-native - React Navigation 5 处理模态、底部选项卡和堆栈
- sql - Processing time given by Oracle explain plan not matching execution time
- javascript - 尝试使用 vanilla javascript 向我的导航栏添加一个活动类
- java - Java stream Collection Map
- flutter - 如何在颤动中更改标签栏项目的大小