【发布时间】:2016-09-06 23:27:50
【问题描述】:
我想使用特定索引的查找表替换系列中的一些值。例如:
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 中有更好的方法。
但是,这只是更复杂任务的一步。对于如何以最易读(和最有效)的 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
对象被某些功能认为是相似的,例如reverse(o1 == 1o 等)。
最终,我想在df 中添加一列colors:
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 为每个对象保存一组颜色。 1o、2o 和 3o 的未知颜色取自它们的兄弟姐妹。
目前,我正在执行以下步骤:
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)
【问题讨论】:
-
我不太明白你的第二个更复杂的部分,但第一个你可以做
s1[s1.index.isin(lookup.keys())] = s1.index.to_series().map(lookup) -
我也对这个问题感到困惑。也许你应该改写它并提供一个更具体的例子。
-
@Alexander:我对示例进行了重大修改,以使事情更清晰。
-
@EdChum:改写的例子怎么样?
-
@user1722901 你有没有找到解决方案?我今天遇到了同样的问题,无法解决。
标签: python dictionary pandas replace series