Pythonパンダ:データフレームを行ごとに埋める


133

行をpandas.DataFrameオブジェクトに追加するという単純なタスクは、実行するのが難しいようです。これに関連する3つのStackoverflow質問があり、どれも有効な回答を提供しません。

これが私がやろうとしていることです。行と列の名前だけでなく形状も知っているDataFrameがあります。

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

これで、行の値を繰り返し計算する関数ができました。行の1つを辞書またはaで埋めるにはどうすればよいpandas.Seriesですか?失敗したさまざまな試みを以下に示します。

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

どうやらそれは行の代わりに列を追加しようとしました。

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

非常に有益でないエラーメッセージ。

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

どうやらそれはデータフレームで個々の値を設定するためだけのものです。

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

さて、私はインデックスを無視したくない、そうでなければここに結果があります:

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

列名を値に合わせましたが、行ラベルは失われました。

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

それも無残に失敗しました。

それで、どうやってそれを行うのですか?

回答:


92

df['y'] 列を設定します

行を設定したいので、 .loc

ここで.ixは同等であることに注意してくださいy。行の各要素にディクショナリを割り当てようとしたため、失敗した可能性があります。シリーズに変換すると、パンダに入力を揃えるように指示します(たとえば、すべての要素を指定する必要はありません)。

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

そうですか。したがって、locデータフレームの属性は、__setitem__私が推測する魔法を実行する特別なものを定義します。
xApple

これを1つのパス(つまり、列、インデックス、y)で構築できますか?
アンディヘイデン2013年

5
したがって、一度に1つの行を生成できる場合、データフレームを最適に構築するにはどうすればよいでしょうか。
xApple

のバリアントが機能することを期待していましたかdf = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
アンディヘイデン

辞書(またはリスト)のリストを作成し、コンストラクタに渡すだけで@xAppleが最も効率的になる
Jeff

71

私のアプローチはそうでしたが、これが最速のソリューションであることを保証できません。

df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

4
これは私にとって見事にappend機能し、データをデータフレームに明示的に送信することが好きです。
ジョニーブルックス

1
この回答では、各行に列名を追加する必要があることに注意してください。受け入れられた答えについても同じです。
pashute 2017年

これは、事前に行数がわからない場合にも機能します。
アイリーン

34

これはより簡単なバージョンです

import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

4
質問したいのですが、このCPUとメモリは効率的ですか?
czxttkl 2017年

1
dfの最後の行をどのようにして知ることができるので、毎回最後の行に追加しますか?
pashute 2017年

24

入力行が辞書ではなくリストである場合、以下は簡単な解決策です。

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6

マルチインデックスがある場合はどうすればよいですか?df1 = pd.DataFrame(list_of_lists、columns ['A'、 'B'、 'C​​']、index = ['A'、 'B'])は機能しません。形状が間違っています。どうやって?
pashute 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.