ilocを使用して値を設定する[終了]


13

このラインは、データフレームの最初の4行を返すcombinedためfeature_a

combined.iloc[0:4]["feature_a"]

予想どおり、この次の行はcolumnのデータフレームの2行目、4行目、および16行目を返しますfeature_a

combined.iloc[[1,3,15]]["feature_a"]

この行は、データフレームの最初の4行をに設定feature_a77ます。

combined.iloc[0:4]["feature_a"] = 77

この行は何かをします。長いリストに適用すると時間がかかるため、ある種の計算が行われています。

combined.iloc[[1,3,15]]["feature_a"] = 88

2行目、4行目、および16行目は、次のようにチェックすると設定されません88

combined.iloc[[1,3,15]]["feature_a"]

大規模なコーディングの迂回をせずに、データフレームの列の行の任意のリストを値に設定するにはどうすればよいですか?

このシナリオは、非常に単純で一般的であるように思われます。


これはプログラミングに関する質問(統計情報なし)であるため、スタックオーバーフロー
ジェイクウェストフォール

最小限の再現性のある例がないと質問のこの種はstackoverflowの上の話題にもオフになります
Glen_b -Reinstateモニカ

回答:


24

セレクターを逆にして、最初に列で選択すると、正常に機能します。

コード:

df.feature_a.iloc[[1, 3, 15]] = 88

どうして?

最初の(非機能的な方法)を実行したときは、データフレームの連続していないセクションを選択しています。警告が表示されるはずです。

DataFrameからのスライスのコピーに値を設定しようとしています。代わりに.loc [row_indexer、col_indexer] = valueを使用してみてください

ドキュメントの警告を参照してください:http : //pandas.pydata.org/pandas- > docs / stable / indexing.html#indexing-view-versus-copy

これは、2つの独立した操作が行われているためです。

  1. combined.iloc[[1,3,15]]3行のみの新しいデータフレームを作成し、フレームは必ずコピーされます。その後...
  2. 経由で1つの列を選択します["feature_a"]が、コピーに対して選択されます。

したがって、割り当てはコピーになります。これを修正するにはさまざまな方法がありますが、この場合、最初に列を選択し、次に割り当てのために列の一部を選択する方が簡単です(より安価です)。

テストコード:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

結果:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0

1
これはうまくいくかもしれませんが、なぜですか?
マシュードゥルーリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.