パンダの列の名前を変更する


1826

元の列ラベルを置き換えるために編集する必要があるパンダと列ラベルを使用するDataFrameがあります。

A元の列名が次のようなDataFrameの列名を変更したいと思います。

['$a', '$b', '$c', '$d', '$e'] 

['a', 'b', 'c', 'd', 'e'].

編集した列名をリストに保存していますが、列名を置き換える方法がわかりません。


1
列ラベルの名前の変更をカバーする公式ドキュメントをチェックすることをお勧めします:pandas.pydata.org/pandas-docs/stable/user_guide/text.html
ccpizza

回答:


1828

それを.columns属性に割り当てるだけです:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

303
単一の列ヘッダー名を変更することはできますか?
ericmjl 2013年

112
@ericmjl:dfの最初の変数の名前を変更するとします。:次に、あなたのような何かを行うことができますnew_columns = df.columns.values; new_columns[0] = 'XX'; df.columns = new_columns
CD98

54
単純にdf.columns.values [0] = 'XX'を実行できたように見えます
RAY

25
@RAY-冗談です、それをしないでください。これは、列名を格納するインデックス付けとは無関係に生成されたリストのようです。dfの列名を破壊する素晴らしい仕事をしていますか?
ミッチフラックス

433
@ericmjlはいdf.rename(columns = {'$b':'B'}, inplace = True)
nachocab '11 / 09/15

2847

特定の列の名前を変更

df.rename()関数を使用して、名前を変更する列を参照します。すべての列の名前を変更する必要はありません。

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

最小限のコード例

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

次のメソッドはすべて機能し、同じ出力を生成します。

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

変更はインプレースではないので、結果を元に戻すことを忘れないでください。または、次のように指定しますinplace=True

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

v0.25以降errors='raise'、無効なcolumn-to-renameが指定された場合にエラーを発生させるように指定することもできます。v0.25 rename()docsを参照してください。


列ヘッダーの再割り当て

andとdf.set_axis()一緒に使用します(コピーを返すため)。axis=1inplace=False

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

これはコピーを返しますが、DataFrameを次のように設定することでインプレースで変更できます inplace=True(これはバージョン<= 0.24のデフォルトの動作ですが、将来変更される可能性があります)。

ヘッダーを直接割り当てることもできます。

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

2
6列のデータフレーム(データフレーム<Enterキーを押す>)でこれを行うと、省略表現:code<class 'pandas.core.frame.DataFrame'> Int64Index:1000エントリ、0〜999データ列:BodyMarkdown 1000非nullがcode機能します、しかしdataframe.head()を実行すると、列の古い名前が再表示されます。
darKoram 2012

12
私は恐怖を感じる SettingWithCopyWarning:この回答で2番目のコードスニペットを使用するとなります。
モニカヘドネック

正規表現に置き換えられたこのバージョンはありますか?
denfromufa

@lexual 2つの既存の列が同じ名前の場合はどうなりますか?古い列名を参照するにはどうすればよいですか?
vagabond 2017年

14
最初の解決策:df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})表示される名前を変更しますが、基になるデータ構造の要素は変更しません。だから、あなたがしようとdf['newName1']すると、エラーが発生します。inplace=Trueそのgotchyaを回避する必要があります。
irritable_phd_syndrom

402

rename方法は取ることができます機能を、たとえば:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

56
いいね。これは私の日を救った:df.rename(columns=lambda x: x.lstrip(), inplace=True)
root-11

2
@ root-11に似ています-私の場合、IPythonコンソール出力に出力されなかった箇条書きの文字があったため、空白(ストライプ)以外のものも削除する必要があったので、:t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
Red Pea

9
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)を書くdf.Column_1_Name代わりに書けるようにするための宝石df.loc[:, 'Column 1 Name']です。
リトルボビーテーブル


164

パンダ0.21+答え

バージョン0.21では、列の名前変更にいくつかの重要な更新がありました。

  • renameこの方法は、追加したaxisに設定することができるパラメータcolumns又は1。この更新により、このメソッドは他のパンダAPIと一致します。それはまだindexありますcolumnsパラメータますが、それらを使用する必要はありません。
  • set_axis方法inplaceセットにFalseリストにすべてのインデックスまたは列のラベルの名前を変更することができます。

Pandas 0.21+の例

サンプルDataFrameを作成します。

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

またはで使用renameするaxis='columns'axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

または

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

どちらも次の結果になります。

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

古いメソッドシグネチャを使用することも可能です。

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

このrename関数は、各列名に適用される関数も受け入れます。

df.rename(lambda x: x[1:], axis='columns')

または

df.rename(lambda x: x[1:], axis=1)

使用してset_axisリストにし、inplace=False

set_axis列(またはインデックス)の数と同じ長さのリストをメソッドに提供できます。現在、inplaceデフォルトはTrueですが、将来のリリースではinplaceデフォルトになる予定Falseです。

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

または

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

なぜ使用しないのdf.columns = ['a', 'b', 'c', 'd', 'e']ですか?

このように列を直接割り当てることには何の問題もありません。それは完全に良い解決策です。

を使用する利点はset_axis、メソッドチェーンの一部として使用できることと、DataFrameの新しいコピーを返すことです。それがないと、列を再割り当てする前に、チェーンの中間ステップを別の変数に保存する必要があります。

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

1
ありがとうPandas 0.21+ answer-どういうわけか「新着情報」のパートでそのパートを逃しました...
MaxU

1
解決策はPandas 3.6では機能しないようです:df.rename({'$ a': 'a'、 '$ b': 'b'、 '$ c': 'c'、 '$ d': 'd '、' $ e ':' e '}、axis =' columns ')。予期しないキーワード引数「軸」を取得
アーサーD.ハウランド

3
df.columns = ['a'、 'b'、 'c'、 'd'、 'e']はもう機能していないようです。バージョン0.22を使用すると、Pandasで列の作成が許可されない新しい属性名。すべての列が同じ名前である場合の名前の変更方法:/
Nabla

列の名前が事前にわからないが、インデックスだけがわかっている場合、1つ、複数、またはすべての列の名前を変更する方法はありますか?ありがとう!
tommy.carstensen

これは非常に役立つコメントでした。たとえば、ラムダ関数は、次のことを行う方法についての私の質問に回答しました:(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
measureallthethings

131

すべての列名の$記号のみを削除したいので、次のようにできます。

df = df.rename(columns=lambda x: x.replace('$', ''))

または

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

1
これはOPの場合だけでなく、一般的な要件でも役立ちます。例:列名を区切り記号で分割し、その一部を使用します。
Deepak '20年


61
old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

この方法で、new_names必要に応じて手動でを編集できます。スペルミスやアクセントを修正したり、特殊文字を削除したりするために数列のみの名前を変更する必要がある場合に効果的です。


1
このアプローチは好きdf.columns = ['a', 'b', 'c', 'd', 'e']ですが、もっと簡単だと思います。
クリストファーピアソン

1
古い名前と新しい名前を圧縮するこの方法が好きです。df.columns.values古い名前を取得するために使用できます。
bkowshik 2015

1
表形式のビューを表示し、列をold_namesにコピーします。要件配列をnew_namesにコピーします。次に、dict(zip(old_names、new_names))を使用します。非常にエレガントなソリューションです。
mythicalcoder

私はよくリストのサブセットを使用します: myList = list(df) myList[10:20]などなど-これは完璧です。
Tim Gottgetreu 2017

@bkowshikが示唆したように、それらを編集し、それらを再挿入し、古い名前を取るためにベスト、つまりはnamez = df.columns.values、その後、いくつかの編集が続きますdf.columns = namez
pauljohn32

34

単一ラインまたはパイプラインソリューション

2つのことに焦点を当てます。

  1. OPは明確に述べています

    編集した列名をリストに保存していますが、列名を置き換える方法がわかりません。

    '$'各列ヘッダーの最初の文字を置換または削除する方法の問題を解決したくありません。OPはすでにこのステップを実行しています。代わりにcolumns、置換列名のリストを指定して、既存のオブジェクトを新しいオブジェクトに置き換えることに焦点を当てたいと思います。

  2. df.columns = newnew新しい列の名前のリストはどこにあるのかというと、簡単です。このアプローチの欠点は、既存のデータフレームのcolumns属性を編集する必要があり、インラインで実行されないことです。既存のデータフレームを編集せずにパイプライン経由でこれを実行するいくつかの方法を示します。


セットアップ1
列名を既存のリストに置き換えるために名前を変更する必要があることに焦点を当てるために、df最初の列名と無関係な新しい列名を含む新しいサンプルデータフレームを作成します。

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

解決策1
pd.DataFrame.rename

古い列名を新しい列名にマッピングするディクショナリがある場合は、を使用できるとすでに言われていますpd.DataFrame.rename

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

ただし、その辞書を簡単に作成して、への呼び出しに含めることができますrename。以下はdf、を反復するときに各列名を反復するという事実を利用しています。

# given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

これは、元の列名が一意である場合に最適です。しかし、そうでない場合、これは失敗します。


2
つの一意でない列を設定する

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

引数
pd.concatを使用したソリューション2keys

最初に、ソリューション1を使用しようとするとどうなるかに注意してください。

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

newリストを列名としてマップしませんでした。繰り返してしたy765。代わりに、の列を繰り返し処理しながらkeyspd.concat関数の引数を使用できますdf

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

ソリューション3
再構築。これはdtype、すべての列に単一の列がある場合にのみ使用してください。そうしないとdtype object、すべての列が最終的になり、それらを元に戻すには、より多くの辞書作業が必要になります。

シングル dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

混合 dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

解決策4
これは、transposeおよびを使用したギミックset_indexです。 pd.DataFrame.set_indexインラインでインデックスを設定できますが、対応するものはありませんset_columns。したがってset_index、転置してから、転置して戻すことができます。ただし、同じ単一またはdtype混合dtypeソリューション3警告警告がここで適用されます。

シングル dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

混合 dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

ソリューション5の各要素を循環
するlambdain pd.DataFrame.renameを使用しますnew
。このソリューションでは、ラムダを渡しますxが、無視します。それはまたかかりますが、y期待していません。代わりに、イテレータがデフォルト値として与えられ、それを使用して、値が何であるかに関係なく、一度に1つずつ循環することができますx

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

そして、sopythonチャットの人々が私に指摘したように、*との間にaを追加するxyy変数を保護できます。ただし、このコンテキストでは、保護する必要があるとは思いません。それはまだ言及する価値があります。

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

追加できるかもしれませんdf.rename(lambda x : x.lstrip('$'),axis=1)
YOBEN_S 2018年

こんにちは@piRSquared、パンダがソリューション5でラムダ関数を使用する方法について詳しく説明できますか?あなたxが無視されていると言うとき、私はあなたが何を意味しているのかよくわかりませんか?
Josmoor98

33

列名とシリーズの名前

裏で何が起こっているのかを少し説明したいと思います。

データフレームはシリーズのセットです。

順番にシリーズはの延長です numpy.array

numpy.arraysにはプロパティがあります .name

シリーズの名前です。パンダがこの属性を尊重することはめったにありませんが、それは場所に残り、いくつかのパンダの動作をハッキングするために使用できます。

列のリストに名前を付ける

ここでの答えの多くは、実際にはであるdf.columns属性がであると述べています。これは、属性があることを意味します。listSeries.name

列の名前を入力すると、次のようになりますSeries

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index       
0                                    4           1
1                                    5           2
2                                    6           3

インデックスの名前は常に1列下に来ることに注意してください。

残るアーティファクト

.name属性は時々に残ります。設定df.columns = ['one', 'two']するdf.one.nameと、になります'one'

あなたが設定した場合df.one.name = 'three'、その後df.columnsまだあなたを与えるだろう['one', 'two']、とdf.one.nameあなたを与えるだろう'three'

だが

pd.DataFrame(df.one) 戻ります

    three
0       1
1       2
2       3

パンダ.nameはすでに定義されているものを再利用するからSeriesです。

マルチレベルの列名

パンダには、多層の列名を作成する方法があります。それほど魔法は関係していませんが、誰かがこれをここで取り上げているのを見かけないので、私もこれを私の答えでカバーしたいと思いました。

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

これは、次のように列をリストに設定することで簡単に実現できます。

df.columns = [['one', 'one'], ['one', 'two']]

18

データフレームがある場合、df.columnsはすべてを操作可能なリストにダンプし、列の名前としてデータフレームに再割り当てします...

columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output

最良の方法?IDK。方法-はい。

質問への回答で提案されたすべての主要な手法を評価するより良い方法は、cProfileを使用してメモリと実行時間を測定することです。@ kadee、@ kaitlyn、および@eumiroには、実行時間が最も速い関数がありました。これらの関数は非常に高速ですが、すべての回答について.000秒と.001秒の丸めを比較しています。道徳:上記の私の答えはおそらく「最良の」方法ではありません。

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}

df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})

df.head()

def eumiro(df,nn):
    df.columns = nn
    #This direct renaming approach is duplicated in methodology in several other answers: 
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df,col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df,on,nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$','')

def awo(df):
    columns = df.columns
    columns = [row.replace("$","") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

名前変更メソッドが必要なのはなぜですか?このような何かが私にとってはうまくいった#df.columns = [row.replace( '$'、 '')for row in df.columns]
shantanuo

「もの」の部分がわかりません。何を代用する必要がありますか?古いコラム?
Andrea Ianni

18

これがあなたのデータフレームだとしましょう。

ここに画像の説明を入力してください

2つの方法を使用して列の名前を変更できます。

  1. 使用する dataframe.columns=[#list]

    df.columns=['a','b','c','d','e']

    ここに画像の説明を入力してください

    このメソッドの制限は、1つの列を変更する必要がある場合、完全な列リストを渡す必要があることです。また、このメソッドはインデックスラベルには適用できません。たとえば、これを渡した場合:

    df.columns = ['a','b','c','d']

    これはエラーになります。長さの不一致:予期される軸には5つの要素があり、新しい値には4つの要素があります。

  2. 別の方法は、rename()インデックス、列、または行の名前を変更するために使用されるPandas メソッドです

    df = df.rename(columns={'$a':'a'})

    ここに画像の説明を入力してください

同様に、任意の行または列を変更できます。


17
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

新しい列のリストが既存の列と同じ順序である場合、割り当ては簡単です。

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

古い列名を新しい列名にキー付けしたディクショナリがある場合、次の操作を実行できます。

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

リストまたは辞書のマッピングがない場合は$、リスト内包表記を使用して先頭の記号を取り除くことができます。

df.columns = [col[1:] if col[0] == '$' else col for col in df]

2
代わりに、lambda col: d[col]あなたが渡すことができますd.get...それは次のようになりますdf.columns.map(d.get)
piRSquared


15

小さな例で名前の変更を理解しましょう...

1.マッピングを使用して列の名前を変更する:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) #creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"},axis='columns',inplace =True) #renaming column A with 'new_a' and B with 'new_b'

output:
   new_a  new_b
0  1       4
1  2       5
2  3       6

2.マッピングを使用してindex / Row_Nameの名前を変更します:

df.rename({0: "x", 1: "y", 2: "z"},axis='index',inplace =True) #Row name are getting replaced by 'x','y','z'.

output:
       new_a  new_b
    x  1       4
    y  2       5
    z  3       6

最も高く支持されている答えにはすでにそのような例があります...
Itamar Mushkin

14

元の列ラベルを置き換えるもう1つの方法は、元の列ラベルから不要な文字(ここでは「$」)を取り除くことです。

これは、df.columnsに対してforループを実行し、ストリップされた列をdf.columnsに追加することで実行できます。

代わりに、以下のようなリスト内包表記を使用することにより、1つのステートメントでこれをきれいに行うことができます。

df.columns = [col.strip('$') for col in df.columns]

stripPythonのメソッドは、指定された文字を文字列の最初と最後から削除します。)


2
これがどのように/なぜ機能するのか説明できますか?これにより、将来の読者にとって、答えがより価値のあるものになります。
Dan Lowe

12

本当にシンプルな使い方

df.columns = ['Name1', 'Name2', 'Name3'...]

そして、それはあなたがそれらを入れた順序で列名を割り当てます


10

あなたはそれのために使うことができますstr.slice

df.columns = df.columns.str.slice(1)

1
PS:これはより冗長な同等物df.columns.str[1:]です...おそらくそれを使う方が良いでしょう、それはより短くより明白です。
-cs95

9

私はこの質問と答えが噛み殺されたことを知っています。しかし、私が抱えていた問題の1つにインスピレーションを得るためにそれを参照しました。私はさまざまな答えからの断片を使用してそれを解決することができたので、誰かがそれを必要とする場合に備えて私の応答を提供しました。

私の方法は、delimiters=変数をコンマで区切って区切り文字を追加し、将来を保証できる汎用的な方法です。

作業コード:

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

出力:

>>> df
   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

>>> df
   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

8

これらのアプローチはMultiIndexでは機能しないことに注意してください。MultiIndexの場合、次のようなことを行う必要があります。

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

8

別のオプションは、正規表現を使用して名前を変更することです:

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

6

あなたが提供できないシステムによって指定された列の負荷に対処する必要がある場合は、一般的なアプローチと特定の置換を一度に組み合わせた次のアプローチを思いつきました。

最初に列名の特定の付録を破棄するために正規表現を使用してデータフレーム列名からディクショナリを作成し、次に特定の置換をディクショナリに追加して、後で受信側データベースで期待されるようにコア列に名前を付けます。

これは、一度にデータフレームに適用されます。

dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID'
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)

5

すでに提供されている解決策に加えて、ファイルの読み取り中にすべての列を置き換えることができます。それを使用namesheader=0て実行できます。

まず、列名として使用する名前のリストを作成します。

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

この場合、すべての列名は、リストにある名前に置き換えられます。


4

これは、タイピングを減らすために使用したい気の利いた小さな関数です。

def rename(data, oldnames, newname): 
    if type(oldnames) == str: #input can be a string or list of strings 
        oldnames = [oldnames] #when renaming multiple columns 
        newname = [newname] #make sure you pass the corresponding list of new names
    i = 0 
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0: 
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: #doesn't have to be an exact match 
            print("Found multiple columns that matched " + str(name) + " :")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1 
    return data   

これがどのように機能するかの例です:

In [2]: df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['col1','col2','omg','idk'])
#first list = existing variables
#second list = new names for those variables
In [3]: df = rename(df, ['col','omg'],['first','ohmy']) 
Found multiple columns that matched col :
0: col1
1: col2

please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')

1
このような関数の使用例は非常にまれです。ほとんどの場合、何を探しているのか、何に名前を変更したいのかがわかっているので、自分で割り当て/変更します。
cs95

1
@ cs95私は、大規模な国内または国際調査で作業する傾向があります。この場合、変数は、rtscaleスケールなどの回答オプション、および分岐(EDU_2913.443、EDU_2913.421など)に応じてプレフィックスで始まるコード化された変数名を持ちます。この関数は、これらのタイプのセットを操作する上で非常に役立ちましたが、そうでない場合も理解できます:)
seeiespi

4

パンダの列の名前を変更するのは簡単です。

df.rename(columns = {'$a':'a','$b':'b','$c':'c','$d':'d','$e':'e'},inplace = True)

2

正規表現を使用できると仮定します。このソリューションにより、正規表現を使用して手動でエンコードする必要がなくなります

import pandas as pd
import re

srch=re.compile(r"\w+")

data=pd.read_csv("CSV_FILE.csv")
cols=data.columns
new_cols=list(map(lambda v:v.group(),(list(map(srch.search,cols)))))
data.columns=new_cols

2
Stack Overflowでは、ソリューションが機能する理由、または既存のソリューションよりも優れている理由に関する説明を追加することをお勧めします。詳細については、回答方法をご覧ください。
Samuel Liew

最も評価の高い回答には何らかのハードコーディングが必要であり、最も評価の低い回答には記述的で手続き的なアプローチのみが必要なことに注意してください。
Kaustubh J

これよりも正規表現を利用する優れた(より読みやすい)ソリューションがあります。これは、単純な名前変更操作の場合よりも多くのことを行っています。また、パターンが何にも一致しない危険性もあります。その場合、エラーを処理するために何もしていません。
cs95
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.