Дан список индексов, модифицирующих подмножество рядов панд по этим индексам - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу изменить значения кадра данных с индексом = [1,3,5,7,9] на другие значения.Но следующий код не может работать вообще.

df = pd.DataFrame({'col1': [1000]*12})
s1 = pd.Series([i for i in range(2,7)])#supposedly new values
index = [2*i+1 for i in range(5)]#Given indices
df.iloc[index]['col1'] = s1#attempt to modify the values
print(df)

Вывод следующий:

   col1
0  1000
1  1000
2  1000
3  1000
4  1000
5  1000
6  1000
7  1000
8  1000
9  1000
10 1000
11 1000
C:/Users/User/Desktop/all python file/3.2.4/iloc_assign.py:13: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вам также нужно указать index из col1, поскольку df.iloc принимает целочисленные индексы:

>>> df.iloc[index, 0] = s1.values 
>>> df
      col1
0   1000.0
1      2.0
2   1000.0
3      3.0
4   1000.0
5      4.0
6   1000.0
7      5.0
8   1000.0
9      6.0
10  1000.0
11  1000.0

Вы можете получить индекс столбца, используя df.columns.get_loc.Итак, в целом ваш код должен выглядеть так:

import pandas as pd
df = pd.DataFrame({'col1': [1000]*12})
s1 = pd.Series([i for i in range(2,7)])
index = [2*i+1 for i in range(5)] 
df.iloc[index, df.columns.get_loc('col1')] = s1.values
0 голосов
/ 13 декабря 2018

Я считаю, что вам просто нужно

>>> df.loc[index, 'col1'] = s1.values                                                                                  
>>> df                                                                                                                 
    col1
0   1000
1      2
2   1000
3      3
4   1000
5      4
6   1000
7      5
8   1000
9      6
10  1000
11  1000
...