2016-05-11 16 views
1

特定のインデックスのルックアップテーブルを使用して、一連の値を置き換えたいとします。たとえば:パンダ:インデックスの参照によってシリーズの値を置き換えます。

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

確かに、私は辞書をループすることによってこれを行うことができますが、私は強くパンダで、より良い方法があると仮定します。

しかし、これはもっと複雑な作業の一歩です。私はパンダの最も読みやすい(そして効率的な)方法で以下のことを達成する方法を提案することに感謝します。

目的は、集約された情報を保持する列を計算することです。 は、例えば、私は、このようなデータフレーム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など)。 は最終的に、私はdfに列colorsを追加したい: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} 

1o2oおよびの未知の色は、それらの兄弟から取得されます。

現在、私はこれらの手順をしています:

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

私は非常にあなたの第二のより複雑な部分を理解したがためにしていません最初に 's1 [s1.index.isin(lookup.keys())] = s1.index.to_series()。map(lookup)'を実行することができます。 – EdChum

+0

この質問でも混乱します。おそらく、あなたはそれに言い換えてより具体的な例を提供するべきです。 – Alexander

+0

@アレクサンダー:私は事をより明確にするために、この例を大幅に見直しました。 – user1722901

答えて

0

あなたの最初の(簡単な)例を使用して、あなたが行うことができます:

In [29]: s1.update(pd.Series(lookup)) 

In [30]: s1 
Out[30]: 
p1  keep 
p2 altered 
p3 changed 
dtype: object 
関連する問題