gpt4 book ai didi

python - 如果任何单个属性匹配,则将 Pandas 的列值替换为另一个(确定两列是否具有共同属性)

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:02 25 4
gpt4 key购买 nike

假设一个样本数据框:

   Chemical   Compound     Name
0 Alcohol Ethanol Liquor
1 Hooch NaN Liquor
2 Cerveza Ethanol NaN
3 Bauxite Aluminium Gibbsite
4 Feldspar Aluminium NaN

如果两行相同,替换或识别的有效方法是什么? (假设两行相同如果任何属性(列)匹配并且不一定全部匹配)

结果可能是:

   Chemical   Compound     Name
0 Alcohol Ethanol Liquor
1 Alcohol NaN Liquor
2 Alcohol Ethanol NaN
3 Bauxite Aluminium Gibbsite
4 Bauxite Aluminium NaN

或:

   Chemical   Compound     Name Identifier
0 Alcohol Ethanol Liquor Alcohol
1 Hooch NaN Liquor Alcohol
2 Cerveza Ethanol NaN Alcohol
3 Bauxite Aluminium Gibbsite Bauxite
4 Feldspar Aluminium NaN Bauxite

最佳答案

这是一个变相的集合合并/连接组件/联合查找问题。

如果我们武断地将其视为连通分量问题,我们可以将框架中的每个单词想象成一个节点。 A a a row 基本上表示那里的元素是等价的,或者换句话说,是可达的:节点之间有边。要确定同义词集,我们需要找到图的连通分量。

import networkx as nx
G = nx.from_pandas_dataframe(df.stack().reset_index(), source='level_0', target=0)
codes = {v: i for i, vv in enumerate(nx.connected_components(G)) for v in vv}
df["Identifier"] = df["Chemical"].groupby(df["Chemical"].replace(codes)).transform("first")

给我

In [229]: df
Out[229]:
Chemical Compound Name Identifier
0 Alcohol Ethanol Liquor Alcohol
1 Hooch NaN Liquor Alcohol
2 Cerveza Ethanol NaN Alcohol
3 Bauxite Aluminium NaN Bauxite
4 Feldspar Aluminium NaN Bauxite

因为一旦我们制作了带有边(等价)的图

In [233]: G.edges()
Out[233]:
[(0, 'Alcohol'),
(0, 'Ethanol'),
(0, 'Liquor'),
('Ethanol', 2),
('Liquor', 1),
(1, 'Hooch'),
(2, 'Cerveza'),
(3, 'Bauxite'),
(3, 'Aluminium'),
('Aluminium', 4),
(4, 'Feldspar')]

我们可以要求 networkx 找到组:

In [234]: list(nx.connected_components(G))
Out[234]:
[{0, 1, 2, 'Alcohol', 'Cerveza', 'Ethanol', 'Hooch', 'Liquor'},
{3, 4, 'Aluminium', 'Bauxite', 'Feldspar'}]

然后剩下的就是将这些转化为数字,并任意选择使用第一个化学条目作为每个组的名称。

我们可以通过使用 scipy 的 scipy.sparse.csgraph.connected_components 函数来做完全相同的事情,只需多一点设置,或者简单地使用现成的集合合并算法来查找组。例如,使用集合合并算法 here , 我们可以做

In [240]: consolidate([set(row.dropna()) for _, row in df.iterrows()])
Out[240]:
[{'Alcohol', 'Cerveza', 'Ethanol', 'Hooch', 'Liquor'},
{'Aluminium', 'Bauxite', 'Feldspar'}]

我们又一次拥有了我们需要的组。

关于python - 如果任何单个属性匹配,则将 Pandas 的列值替换为另一个(确定两列是否具有共同属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52378071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com