変数の値からpandas DataFrameを作成すると、「ValueError:すべてのスカラー値を使用する場合は、インデックスを渡す必要があります」


370

これは簡単な質問かもしれませんが、これを行う方法がわかりません。次のように2つの変数があるとしましょう。

a = 2
b = 3

これからDataFrameを構築したい:

df2 = pd.DataFrame({'A':a,'B':b})

これはエラーを生成します:

ValueError:すべてのスカラー値を使用する場合は、インデックスを渡す必要があります

私もこれを試しました:

df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()

これにより、同じエラーメッセージが表示されます。

回答:


571

エラーメッセージは、スカラー値を渡す場合、インデックスを渡す必要があることを示しています。したがって、列にスカラー値を使用することもできません-たとえばリストを使用します。

>>> df = pd.DataFrame({'A': [a], 'B': [b]})
>>> df
   A  B
0  2  3

または、スカラー値を使用してインデックスを渡します。

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3

7
おそらくそれは、Pythonのリスト内のアイテムの順序が永続的であるのに対し、ディクショナリ内のアイテムの順序は永続的ではないためです。空の辞書でDataFrameをインスタンス化できます。原則として、ここに示されている単一行のDataFrameも、順序は関係ないため(ただし、これは実装されていません)、ディクショナリから構築しても問題ないと思います。ただし、複数の行がある場合、Pandasはどの行が同じ行に属しているかがわからないため、DataFrameを作成できません。
Alexander

2
@VitalyIsaev-その場合、データフレーム行(指定されたディクショナリによって表される)にはインデックスがありません(暗黙的なものでさえありません)。簡単な解決策は、「自然なインデックス付け」を備えたリスト内で辞書をラップすることです。辞書が1つしか指定されていない場合(ラッピングリストなしで)は、と仮定しますがindex=0、これは誤った誤用につながる可能性があります(単一の辞書が何らかの方法で複数行のデータフレームを作成する可能性があると考えます)
Ori

このリンクではいくつかのソリューションeulertech.wordpress.com/2017/11/28/...
ジェイソン・ゴール

これは、DataFrameが2次元データ(つまり、OPの2つの変数の行)を保持するためのものだからです。(辞書のように)単にインデックス->値のペアを保持したい場合は、Robが示唆するように、シリーズを使用する必要があります。
danuker

これは単一のサンプル/行のデータフレームであるため、index = [0]は論理的に意味があります。しかし、index = [100]になるように操作することもできます。これは機能します。Q:Indexは論理的にインクリメンタルに並べられるべきではありませんが、なぜPythonはIndexの操作を許可するのですか?
Sumanth Lazarus

65

pd.DataFrame.from_recordsすでに辞書を持っている場合に便利な方を使用することもできます:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }])

必要に応じて、次の方法でインデックスを設定することもできます。

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')

27
この回答は機能しません-from_recordsを使用すると同じエラーメッセージが表示されます。
Dave Kielpinski 2017年

デイブ、コードを試しましたか(もちろんaとbを定義しています)?それでもエラーメッセージが表示されますか?投稿できますか?
fAX

12
@DaveKielpinskiかっこを追加するのを忘れていませんか?
デニス

これは、列名としてdictキーを使用します。インデックスにキーを設定するにはどうすればよいですか?
mingchau

@DaveKielpinski 「from_records」メソッドにリストを渡したかどうかを確認してください。それ以外の場合は機能せず、ディクショナリでDataFrameを呼び出したときと同じエラーメッセージが表示されます。
マイラン

55

最初にパンダシリーズを作成する必要があります。2番目のステップは、pandasシリーズをpandasデータフレームに変換することです。

import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()

列名を指定することもできます。

pd.Series(data).to_frame('ColumnName')

1
これでうまくいきました。私の辞書には整数キーとndarray値がありました。
StatsSorceress

pd.Series(data).to_frame('ColumnName')この等価は、おそらくもっと直接的ですが、短いです:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
アレックス・F

29

辞書をリストに入れてみてください

my_dict = {'A':1,'B':2}

pd.DataFrame([my_dict])

   A  B
0  1  2

8

多分シリーズはあなたが必要とするすべての機能を提供するでしょう:

pd.Series({'A':a,'B':b})

DataFrameはシリーズのコレクションと考えることができるため、次のことができます。

  • 複数のシリーズを1つのデータフレームに連結(ここで説明)

  • Series変数を既存のデータフレームに追加します(ここの例


7

Pandas DataFrame列の値としてイテラブルを提供する必要があります。

df2 = pd.DataFrame({'A':[a],'B':[b]})

6

私はnumpy配列で同じ問題を抱えていましたが、解決策はそれらを平坦化することです:

data = {
    'b': array1.flatten(),
    'a': array2.flatten(),
}

df = pd.DataFrame(data)

3

スカラーの辞書を変換する場合は、インデックスを含める必要があります。

import pandas as pd

alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)

リストの辞書にはインデックスは必要ありませんが、同じアイデアをリストの辞書に拡張できます。

planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']}
index = [0, 1, 2]
planets_df = pd.DataFrame(planets, index=index)
print(planets_df)

もちろん、リストのディクショナリの場合、インデックスなしでデータフレームを構築できます。

planets_df = pd.DataFrame(planets)
print(planets_df)

3

あなたは試すことができます:

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')

'orient'引数に関するドキュメントから:渡されたdictのキーが結果のDataFrameの列である必要がある場合は、 'columns'(デフォルト)を渡します。それ以外の場合、キーを行にする必要がある場合は、「index」を渡します。


質問/回答を適切に編集およびフォーマットするには、フォーマットツールを使用してください。文章内のコードは、code 非常に重要な単語として太字で重要度の低いものにフォーマットします。斜体斜体必要に応じてリストも使用します
Morse

これは尋ねられた質問を解決しません、それは望まれるより異なる結果を生み出します。
ケンウィリアムズ

3

仕事でパンダの魔法。すべてのロジックがアウトです。

エラーメッセージ"ValueError: If using all scalar values, you must pass an index"は、インデックスを渡す必要があると言います。

これは必ずしもインデックスを渡すことがパンダにあなたがやりたいことをさせるという意味ではありません

インデックスを渡すと、パンダはディクショナリキーを列名として扱い、値はインデックス内の各値の列に含まれるものとして扱います。

a = 2
b = 3
df2 = pd.DataFrame({'A':a,'B':b}, index=[1])

    A   B
1   2   3

より大きなインデックスを渡す:

df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4])

    A   B
1   2   3
2   2   3
3   2   3
4   2   3

インデックスは通常、何も指定されていないときにデータフレームによって自動的に生成されます。しかし、パンダは、どのように多くの行の知らない23したいです。しかし、あなたはそれについてより明確にすることができます

df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4})
df2

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

ただし、デフォルトのインデックスは0ベースです。

データフレームを作成するときは、常にリストの辞書をデータフレームコンストラクターに渡すことをお勧めします。他の開発者にとっては読みやすいです。パンダには多くの注意事項があります。他の開発者がコードを読むためにそれらすべての専門家に依頼する必要はありません。


3

入力は、レコードのリストである必要はありません。単一の辞書でもかまいません。

pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
   a  b
0  1  2

これは次と同等のようです:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2

2

これは、DataFrameには列行という2つの直感的な次元があるためです。

辞書キーを使用して列のみを指定しています。

1次元データのみを指定する場合は、シリーズを使用してください!


0

辞書をデータフレームに変換

col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()

列に新しい名前を付ける

col_dict_df.columns = ['col1', 'col2']

-2

辞書がある場合は、次のコード行でそれをパンダデータフレームに変換できます。

pd.DataFrame({"key": d.keys(), "value": d.values()})

動作しますが、私見ではあまり意味がありません<code> `<!-言語:lang-py-> Fruits_count = defaultdict(int)Fruits_count [" apples "] = 10 Fruits_count [" bananas "] = 21 pd.DataFrame({"key":fruit_count.keys()、 "value":Fruits_count.values()})Out:キー値0(バナナ、リンゴ)(21、10)1(バナナ、リンゴ)(21、 10)<code>
エミッタは

-3

リストにdictを渡すだけです:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.