Pandas:通过查找索引来替换系列的值

时间:2016-05-11 13:50:19

标签: python dictionary pandas replace series

我想使用查找表替换某些索引中的某些值。例如:

s1     = Series.(['keep', 'replace', 'replace'}, index=['p1', 'p2', 'p3'])
lookup = {'p2' : 'altered', 'p3' : 'changed'}
# desired series s1:
# p1  keep
# p2  altered
# p3  changed

当然,我可以通过循环dict来做到这一点,但我强烈认为熊猫有更好的方法。

但是,这只是一项更复杂的任务。我很感激如何以最可读(最有效)的pandas方式实现以下任何建议。

目标是计算包含一些聚合信息的列。 例如,我得到一个像这样的数据框df

  object color
0     o1    gr
1     o2    gr
2     o2    rd
3     o3    rd
4     1o  None
5     2o  None
6     3o  None

某些功能认为对象类似,例如reverseo1 == 1o等)。 最后,我想向colors添加一列df

  object color    colors
0     o1    gr      {gr}
1     o2    gr  {rd, gr}
2     o2    rd  {rd, gr}
3     o3    rd      {rd}
4     1o  None      {gr}
5     2o  None  {rd, gr}
6     3o  None      {rd}

colors为每个对象保存一组颜色。 1o2o3o的未知颜色取自他们的兄弟姐妹。

目前,我正在执行以下步骤:

d = OrderedDict([('object', ['o1', 'o2', 'o2', 'o3', '1o', '2o', '3o']),\
                 ('color',  ['gr', 'gr', 'rd', 'rd', None, None, None])])
df = pd.DataFrame(d)

# 1. Group and aggregate the colors.
colors = df.groupby('object')['color'].apply(set)

# 2. Compute a lookup table
colored = df.ix[~pd.isnull(df['color']), 'object'].unique()
unknown = df.ix[pd.isnull(df['color']), 'object'].unique()
lookup  = {obj[::-1] : colors[obj] for obj in colored}

# 3. Set colors of `1o`, ... (Initial Question!)
colors[colors.index.isin(lookup.keys())] = colors.index.to_series().map(lookup)

# 4. Add column `colors` original data frame
df['colors'] = df['object'].map(colors)

0 个答案:

没有答案