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
これで、行の値を繰り返し計算する関数ができました。辞書またはpandas.Series
のいずれかで行の1つを埋めるにはどうすればよいですか?失敗したさまざまな試みを次に示します。
>>> 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
それも惨めに失敗しました。
それでどうやってやるの?
df['y']
は列を設定します
行を設定するため、.loc
を使用します
ここでは.ix
は同等であり、行y
name__の各要素に辞書を割り当てようとしたため失敗した可能性があることに注意してください。 Seriesに変換すると、pandasに入力を揃えることが指示されます(たとえば、すべての要素を指定する必要はありません)
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
私のアプローチはそうでしたが、これが最速のソリューションであることを保証することはできません。
df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
"firstname": "John",
"lastname": "Johny"
}, ignore_index=True)
これはよりシンプルなバージョンです
df = 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>']`
入力行が辞書ではなくリストである場合、次は簡単な解決策です。
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