1. ホーム
  2. python

[解決済み] 指定した列の最初の行の値を取得する

2022-03-21 15:04:30

質問

これはとんでもなく簡単な質問のようですが...私が期待していたような簡単な答えは見当たりません。

では、Pandasで与えられた列のn行目の値を取得するにはどうすればよいのでしょうか?(私は特に最初の行に興味がありますが、より一般的なプラクティスにも興味があります).

例えば、1.2という値を引き出すには Btime を変数として使用します。

正しい方法は何ですか?

>>> df_test
    ATime   X   Y   Z   Btime  C   D   E
0    1.2  2  15   2    1.2  12  25  12
1    1.4  3  12   1    1.3  13  22  11
2    1.5  1  10   6    1.4  11  20  16
3    1.6  2   9  10    1.7  12  29  12
4    1.9  1   1   9    1.9  11  21  19
5    2.0  0   0   0    2.0   8  10  11
6    2.4  0   0   0    2.4  10  12  15

解決方法は?

を選択するには ith の行になります。 使用 iloc :

In [31]: df_test.iloc[0]
Out[31]: 
ATime     1.2
X         2.0
Y        15.0
Z         2.0
Btime     1.2
C        12.0
D        25.0
E        12.0
Name: 0, dtype: float64

でi番目の値を選択する。 Btime 列を使用することができます。

In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2


という違いがあります。 df_test['Btime'].iloc[0] (推奨)と df_test.iloc[0]['Btime'] :

DataFrameは、列ベースのブロックにデータを格納します(各ブロックは単一の d型)。最初に列で選択すると ビュー を返すことができます(これは コピーを返すよりも早く、元のdtypeが維持されます。これに対して まず行で選択し、DataFrameが異なる列を持つ場合 dtypes を使用する場合、Pandas コピー のデータをオブジェクト型の新しい系列に変換します。そのため 列の選択は行の選択より少し速いです。したがって df_test.iloc[0]['Btime'] が動作します。 df_test['Btime'].iloc[0] は少し より効率的です。

割り当てに関しては、両者には大きな違いがあります。 df_test['Btime'].iloc[0] = x 影響を与える df_test しかし df_test.iloc[0]['Btime'] はできません。その理由については、以下をご覧ください。 というのも、微妙な違いで インデックス付けの順番は、動作に大きな違いをもたらすので、単一のインデックス付けを使用するのがよいでしょう。

df.iloc[0, df.columns.get_loc('Btime')] = x


df.iloc[0, df.columns.get_loc('Btime')] = x (推奨)です。

推奨方法 に新しい値を割り当てることができます。 DataFrameは 連鎖的なインデックスを回避する を使用し、代わりにメソッド が示すように アンドリュー ,

df.loc[df.index[n], 'Btime'] = x

または

df.iloc[n, df.columns.get_loc('Btime')] = x

後者の方法の方が少し速いです。 df.loc は、行と列のラベルを の位置インデックスを使用すると、変換の必要性が少し減ります。 df.iloc の代わりに


df['Btime'].iloc[0] = x は動作しますが、推奨されません。

これは動作しますが、DataFrameの仕組みを利用したものです。 現在 が実装されています。Pandasが将来的にこのように動作しなければならないという保証はありません。特に、(現在) df['Btime'] は常に ビュー(コピーではありません)なので df['Btime'].iloc[n] = x を使用することができます。 割り当てる 新しい値 のn番目の場所にある Btime 列の df .

Pandasはインデクサがビューを返すかコピーを返すかを明示的に保証していないので、連鎖インデックスを使用した代入は一般的に常に SettingWithCopyWarning この場合、代入が成功し df :

In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)

In [26]: df
Out[26]: 
  foo  bar
0   A   99  <-- assignment succeeded
2   B  100
1   C  100


df.iloc[0]['Btime'] = x は動作しません。

これに対して df.iloc[0]['bar'] = 123 は機能しません。 df.iloc[0] はコピーを返します。

In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

In [67]: df
Out[67]: 
  foo  bar
0   A   99  <-- assignment failed
2   B  100
1   C  100


注意事項 : 以前、私が提案した df_test.ix[i, 'Btime'] . しかし、これでは ith の値は ix でインデックスを作成しようとします。 ラベル でインデックスを作ろうとする前に 位置 . したがって、もしDataFrameが0から始まるソート順でない整数のインデックスを持つ場合、次のように使用します。 ix[i] は行を返します。 ラベル付き i よりも、むしろ ith の行になります。例えば

In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])

In [2]: df
Out[2]: 
  foo
0   A
2   B
1   C

In [4]: df.ix[1, 'foo']
Out[4]: 'C'