我正在使用Python 3.6和Pandas 0.25。
我有以下数据框:
import collections
import datetime
import pandas as pd
import numpy as np
data = {
'col1_data': ['A1', 'A1', 'A1', 'A2', 'A2'],
'col2_data': ['UNMAPPED', 'UNMAPPED', 'GOOD VALUE', 'UNMAPPED', 'CORRECT VALUE']
}
df = pd.DataFrame(data)
如下图所示:
display(df)
基本上,我想将col1_data中所有“ A1”的“ col2_data”值更新为“良好值”,并将col1_data中所有“ A2”的“正确值”更新为“正确值”。
基本上我希望数据框看起来像:
基本上,我需要基于组(col1_data值)进行数据更新,但不进行聚合,即我不想减少行数。因此,如果有3行具有相同的值(A1),则所有3行的col2_data中的值都应相同(有效值),或者不等于“ UNMAPPED”。
有人可以帮忙吗?
更新1: UNMAPPED值不按任何固定顺序出现。Scot的解决方案适用于2根DF色谱柱。但是,DF有多个列(分组或检查不需要)。分组仅取决于col1_data。我们如何在DF中保留其他列?
例如
data = {
'col1_data': ['A1', 'A1', 'A1', 'A2', 'A2'],
'col2_data': ['UNMAPPED', 'UNMAPPED', 'GOOD VALUE', 'UNMAPPED', 'CORRECT VALUE'],
'col3_data': ['B1', 'B2', 'B1', 'B3', 'B4']
}
df = pd.DataFrame(data)
预期产量:
另外,如果更容易根据上述逻辑添加新的派生列,也可以。
如果“正确”字符串始终是组中的最后一个字符串,则可以用np.nan和bfill替换或屏蔽“ UNMAPPED”。
df.replace('UNMAPPED', np.nan).bfill()
输出:
col1_data col2_data
0 A1 GOOD VALUE
1 A1 GOOD VALUE
2 A1 GOOD VALUE
3 A2 CORRECT VALUE
4 A2 CORRECT VALUE
在这种情况下有效。或者,如果它是组中的第一个,则可以使用ffill()
如果它出现在组中的任何位置,则可以使用:
df['col2_data'] = df[['col2_data']].replace('UNMAPPED', np.nan).groupby('col1_data')['col2_data']\
.transform(lambda x: x.ffill().bfill())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句