假设一个示例数据框:
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
答案 0 :(得分:3)
这是一个变相的合并/关联的组件/联合发现的问题。
如果我们任意决定将其视为连接的组件问题,则可以将框架中的每个单词想象为一个节点。一行基本上表示那里的元素是等效的,或者换句话说,是可达的:节点之间存在边。要确定同义词集,我们需要找到图的连接部分。
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'}]
再一次,我们有了所需的组。
答案 1 :(得分:1)
要标识具有至少一个匹配列的行:
>>> df.apply(lambda x: x.dropna().duplicated()).any(axis=1)
0 False
1 True
2 True
3 False
4 True
dtype: bool
在上面,第1、2和4行是“重复项”。第1行:白酒,第2行:乙醇,第4行:铝。
但是,我不清楚您的填充逻辑。