679

Pandas DataFrame を作成しました

df = DataFrame(index=['A','B','C'], columns=['x','y'])

そしてこれを持っています

    XY
A NaN NaN
B NaN NaN
C NaN NaN

Cここで、特定のセル、たとえば rowと columnに値を割り当てたいと思いますx。私はこの結果が得られると期待しています:

    XY
A NaN NaN
B NaN NaN
C 10 NaN

このコードで:

df.xs('C')['x'] = 10

ただし、の内容はdf変更されていません。データフレームには、s のみが含まれていNaNます。

助言がありますか?

4

23 に答える 23

833

RukTech の答えdf.set_value('C', 'x', 10)、私が以下に提案したオプションよりもはるかに高速です。ただし、非推奨になる予定です

今後、推奨される方法は.iat/.atです。


df.xs('C')['x']=10機能しない理由:

df.xs('C')デフォルトでは、データのコピーを含む新しいデータフレームを返すため、

df.xs('C')['x']=10

この新しいデータフレームのみを変更します。

df['x']データフレームのビューを返すdfので、

df['x']['C'] = 10

自分自身を変更dfします。

警告: オペレーションがコピーまたはビューを返すかどうかを予測するのは難しい場合があります。このため、ドキュメントでは "chained indexing" による割り当てを避けることを推奨しています。


したがって、推奨される代替手段は

df.at['C', 'x'] = 10

これ変更しdfます。


In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop

In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop

In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
于 2012-12-12T14:51:02.073 に答える
68

使ってみてdf.loc[row_index,col_indexer] = value

于 2015-10-15T13:32:55.250 に答える
49

値を設定するための(メンテナーによると)推奨される方法は次のとおりです。

df.ix['x','C']=10

「連鎖インデックス」 ( df['x']['C']) を使用すると、問題が発生する可能性があります。

見る:

于 2014-01-22T15:48:25.217 に答える
33

これが私のために働いた唯一のものです!

df.loc['C', 'x'] = 10

詳細については、.loc こちらをご覧ください。

于 2015-10-28T20:56:07.673 に答える
22

値を設定するには、次を使用します。

df.at[0, 'clm1'] = 0
  • 変数を設定するための最速の推奨方法。
  • set_valueix廃止されました。
  • ilocとは異なり、警告はありませんloc
于 2019-05-07T04:56:20.483 に答える
12

私は提案します:

df.loc[index_position, "column_name"] = some_value
于 2020-12-15T23:15:18.473 に答える
4

私がテストしたところ、出力はdf.set_value少し速くなりましたが、公式の方法df.atは非推奨ではない最速の方法のようです。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(100, 100))

%timeit df.iat[50,50]=50 # ✓
%timeit df.at[50,50]=50 #  ✔
%timeit df.set_value(50,50,50) # will deprecate
%timeit df.iloc[50,50]=50
%timeit df.loc[50,50]=50

7.06 µs ± 118 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.52 µs ± 64.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.68 µs ± 80.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
98.7 µs ± 1.07 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
109 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

これは単一セルの値を設定していることに注意してください。ベクトルについては、ベクトルlocilocされているため、より適切なオプションである必要があります。

于 2019-05-07T14:05:42.647 に答える
1

df の位置 (0,0) のセルを などの文字列に変更する場合は'"236"76"'、次のオプションを使用します。

df[0][0] = '"236"76"'
# %timeit df[0][0] = '"236"76"'
# 938 µs ± 83.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

または使用してpandas.DataFrame.at

df.at[0, 0] = '"236"76"'
#  %timeit df.at[0, 0] = '"236"76"' 
#15 µs ± 2.09 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

または使用してpandas.DataFrame.iat

df.iat[0, 0] = '"236"76"'
#  %timeit df.iat[0, 0] = '"236"76"'
# 41.1 µs ± 3.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

または使用してpandas.DataFrame.loc

df.loc[0, 0] = '"236"76"'
#  %timeit df.loc[0, 0] = '"236"76"'
# 5.21 ms ± 401 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

または使用してpandas.DataFrame.iloc

df.iloc[0, 0] = '"236"76"'
#  %timeit df.iloc[0, 0] = '"236"76"'
# 5.12 ms ± 300 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

時間が重要な場合は、 を使用するpandas.DataFrame.atのが最速の方法です。

于 2021-02-08T11:09:00.433 に答える
0

行全体ではなく、一部の列のみの値を変更する場合:

x = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
x.iloc[1] = dict(A=10, B=-10)
于 2018-03-13T15:48:11.613 に答える
-4

私もこのトピックを探していたので、DataFrame を繰り返し処理し、2 番目の DataFrame からのルックアップ値で更新する方法をまとめました。これが私のコードです。

src_df = pd.read_sql_query(src_sql,src_connection)
for index1, row1 in src_df.iterrows():
    for index, row in vertical_df.iterrows():
        src_df.set_value(index=index1,col=u'etl_load_key',value=etl_load_key)
        if (row1[u'src_id'] == row['SRC_ID']) is True:
            src_df.set_value(index=index1,col=u'vertical',value=row['VERTICAL'])
于 2016-01-26T21:40:21.297 に答える