合并具有相同索引的行并确定列值的优先级
Merge rows with same index and prioritize column values
我有一个数据框,其中包含一些重复的索引值,其中的列包含两个不同实验的值。如果两个索引实例中都存在值,我想优先考虑 Col_A。我正在使用以下算法解决此解决方案。
- 合并具有相同索引的行
- 使用 combine_first 函数创建新列。到 select Col_A 如果存在否则 select Col_B
示例数据
data = {'id':['id3', 'id3', 'id6'],
'Col_A':[11,NaN,3],
'Col_B':[NaN,5,NaN]}
## Insert SO Magic Here
##
output = {'id':['id3', 'id6'],
'Col_Score':[11,3]}
如果有比我提出的算法“更好”的解决方案(更短),请告诉我。
如果保证每个 id 没有重复的列,那么 data
(或者更确切地说 pd.DataFrame(data)
)可以很容易地重新格式化为:
>>> ser = data.set_index('id').stack()
>>> ser
id
id3 Col_A 11.0
Col_B 5.0
id6 Col_A 3.0
dtype: float64
附带说明一下,如果您再次对其进行拆分,您将获得具有唯一索引的原始数据的更密集版本:
>>> ser.unstack()
Col_A Col_B
id
id3 11.0 5.0
id6 3.0 NaN
我们可以select第一项用groupby而不是.unstack()
,例如:
>>> ser.groupby('id').first().rename('Col_score')
id
id3 11.0
id6 3.0
Name: Col_Score, dtype: float64
然后您可以 .reset_index()
获取数据框而不是序列。
这是一个使用 melt
的解决方案:
(df.melt(id_vars=['id'], value_name='Col_Score') # Col_A will be above Col_B
.dropna() # remove NaN rows
.groupby('variable', as_index=False)
.first() # keep first per group (i.e. Col_A when both)
.drop('variable', axis=1) # cleanup
)
输出:
id Col_Score
0 id3 11.0
1 id3 5.0
我有一个数据框,其中包含一些重复的索引值,其中的列包含两个不同实验的值。如果两个索引实例中都存在值,我想优先考虑 Col_A。我正在使用以下算法解决此解决方案。
- 合并具有相同索引的行
- 使用 combine_first 函数创建新列。到 select Col_A 如果存在否则 select Col_B
示例数据
data = {'id':['id3', 'id3', 'id6'],
'Col_A':[11,NaN,3],
'Col_B':[NaN,5,NaN]}
## Insert SO Magic Here
##
output = {'id':['id3', 'id6'],
'Col_Score':[11,3]}
如果有比我提出的算法“更好”的解决方案(更短),请告诉我。
如果保证每个 id 没有重复的列,那么 data
(或者更确切地说 pd.DataFrame(data)
)可以很容易地重新格式化为:
>>> ser = data.set_index('id').stack()
>>> ser
id
id3 Col_A 11.0
Col_B 5.0
id6 Col_A 3.0
dtype: float64
附带说明一下,如果您再次对其进行拆分,您将获得具有唯一索引的原始数据的更密集版本:
>>> ser.unstack()
Col_A Col_B
id
id3 11.0 5.0
id6 3.0 NaN
我们可以select第一项用groupby而不是.unstack()
,例如:
>>> ser.groupby('id').first().rename('Col_score')
id
id3 11.0
id6 3.0
Name: Col_Score, dtype: float64
然后您可以 .reset_index()
获取数据框而不是序列。
这是一个使用 melt
的解决方案:
(df.melt(id_vars=['id'], value_name='Col_Score') # Col_A will be above Col_B
.dropna() # remove NaN rows
.groupby('variable', as_index=False)
.first() # keep first per group (i.e. Col_A when both)
.drop('variable', axis=1) # cleanup
)
输出:
id Col_Score
0 id3 11.0
1 id3 5.0