2017-07-18 4 views
2

データ型が混在したDataFrameがあります。一部の列名は文字列であり、一部はタプルです。 列名の型を変更せずに列の順序を変更する方法はありますか?パンダ並べ替えるタプルと文字列が混在したDataFrame列

すべての列が文字列である場合、例えば、これは正常に動作します:

df = pd.DataFrame([["Alice", 34], 
        ["Bob", 55]]) 
df.columns = ["name", "age"] 
df[["age", "name"]] 

# Out: 
    age name 
0 34 Alice 
1 55 Bob 

すべての列がタプルであれば、これも問題なく動作します。しかし

df = pd.DataFrame([[5, 30], 
        [6, 31]]) 
df.columns = [(0,0), (1,1)] 
df[[(1,1), (0,0)]] 

# Out[15]: 
    (1, 1) (0, 0) 
0  30  5 
1  31  6 

、列がある場合文字列とタプルが混在すると、エラーが発生します。

df = pd.DataFrame([["Alice", 0, 34], 
        ["Bob", 1, 55]]) 
df.columns = ["name", (0,0), "age"] 
df[["age", "name", (0,0)]] 

# Out: 
ValueError: setting an array element with a sequence 

私はおそらく当時の変換、文字列、またはタプルの文字列に列のタプルを変換することによってこの問題を解決することができます。 しかし、私は本当にこのエラーの原因を知りたいと思っていますし、それをよりエレガントな方法で回避する方法があるかどうかを知りたいと思っています。

+0

エラーは、データフレームの列を設定するときに使用されるコンストラクタ「np.array」に由来します。一致しないデータ型(文字列とタプル)を 'np.array'に渡しています。これは配列に関しては一貫していません。 – Abdou

答えて

1

df[np.array(["age", "name", (0,0)],dtype=object)]作品です。

あなたが指摘したように、列名を含む配列にはタプルと文字列の両方の値があるため、Pythonは不平を言っています。しかし、明示的にdtype=objectを指定して配列を作成すると、配列には任意のオブジェクトを保持し、不平を言わないことが示されます。 dtype引数がスキップされると、dtypeが推論され、Pythonはdtypeが配列全体で同じであるとみなし、エラーを引き起こします。

+0

なぜこれは文字列と数値の混在した列名では問題ではなく、文字列とタプルの列名が混在している場合に問題になるのでしょうか? – cjrieds

+0

残念ながら、わかりません。私はPythonの簡単なテストを実行し、名前を ''(0,0) ''という名前でスカラー '' 0''に変更しました。次に '' df.columns''は '' #Out Index(['name '、0、' age ']、dtype =' object ')、 ''は文字列と数値の列名が混在している場合、オブジェクトdtypeが正しく推測されることを意味します。しかし、私はこの正しい推論がなぜ起こるのか分かりません。 – hausdork

関連する問題