499

次のような辞書があります。di = {1: "A", 2: "B"}

col1次のようなデータフレームの列に適用したいと思います。

     col1   col2
0       w      a
1       1      2
2       2    NaN

取得するため:

     col1   col2
0       w      a
1       A      2
2       B    NaN

これを行うにはどうすればよいですか?何らかの理由で、これに関連するグーグル用語は、辞書から列を作成する方法とその逆の方法に関するリンクのみを表示します:-/

4

11 に答える 11

79

あなたの質問には少し曖昧な点があります。少なくとも3つの 2 つの解釈があります。

  1. のキーはdiインデックス値を参照します
  2. キーは値をdi参照しdf['col1']ます
  3. キーはdiインデックスの場所を参照します(OPの質問ではありませんが、楽しみのために投げ込まれます。)

以下に、ケースごとの解決策を示します。


ケース 1: のキーがインデックス値を参照することを意図している場合は、次の方法diを使用できます。update

df['col1'].update(pd.Series(di))

例えば、

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':['w', 10, 20],
                   'col2': ['a', 30, np.nan]},
                  index=[1,2,0])
#   col1 col2
# 1    w    a
# 2   10   30
# 0   20  NaN

di = {0: "A", 2: "B"}

# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)

収量

  col1 col2
1    w    a
2    B   30
0    A  NaN

元の投稿の値を変更したので、何updateをしているのかがより明確になります。のキーdiがインデックス値にどのように関連付けられているかに注意してください。インデックス値の順序、つまりインデックスの場所は重要ではありません。


ケース 2: のキーが値をdi参照するdf['col1']場合、@DanAllan と @DSM はこれを次の方法で実現する方法を示しますreplace

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':['w', 10, 20],
                   'col2': ['a', 30, np.nan]},
                  index=[1,2,0])
print(df)
#   col1 col2
# 1    w    a
# 2   10   30
# 0   20  NaN

di = {10: "A", 20: "B"}

# The values 10 and 20 are replaced by 'A' and 'B'
df['col1'].replace(di, inplace=True)
print(df)

収量

  col1 col2
1    w    a
2    A   30
0    B  NaN

この場合、 のキーが のdi一致するように変更されていることに注意してください。df['col1']


ケース 3: のキーがdiインデックスの場所を参照する場合は、次を使用できます。

df['col1'].put(di.keys(), di.values())

以来

df = pd.DataFrame({'col1':['w', 10, 20],
                   'col2': ['a', 30, np.nan]},
                  index=[1,2,0])
di = {0: "A", 2: "B"}

# The values at the 0 and 2 index locations are replaced by 'A' and 'B'
df['col1'].put(di.keys(), di.values())
print(df)

収量

  col1 col2
1    A    a
2   10   30
0    B  NaN

ここでは、1 番目と 3 番目の行が変更されています。これは、Python の 0 ベースのインデックスで 1 番目と 3 番目の場所を参照する とのキーdiがあるためです。02

于 2013-11-27T19:04:34.810 に答える
10

DSM には受け入れられた回答がありますが、コーディングはすべての人に適しているわけではないようです。現在のバージョンの pandas (2018 年 8 月時点で 0.23.4) で動作するものを次に示します。

import pandas as pd

df = pd.DataFrame({'col1': [1, 2, 2, 3, 1],
            'col2': ['negative', 'positive', 'neutral', 'neutral', 'positive']})

conversion_dict = {'negative': -1, 'neutral': 0, 'positive': 1}
df['converted_column'] = df['col2'].replace(conversion_dict)

print(df.head())

次のように表示されます。

   col1      col2  converted_column
0     1  negative                -1
1     2  positive                 1
2     2   neutral                 0
3     3   neutral                 0
4     1  positive                 1

pandas.DataFrame.replaceのドキュメントはこちらです。

于 2018-08-08T16:43:57.130 に答える
2

クラスラベルのマップを保持する素晴らしい完全なソリューション:

labels = features['col1'].unique()
labels_dict = dict(zip(labels, range(len(labels))))
features = features.replace({"col1": labels_dict})

このようにして、いつでも labels_dict から元のクラス ラベルを参照できます。

于 2019-05-17T09:14:54.007 に答える