Pandas dataframe заполняет значения между индексами - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть список индексов на фрейме данных с 5 столбцами.

indexes = [5,9,44]

Я хочу создать pd.Series со значением определенных столбцов между индексами.Итак, если

row#5 = ["a","b","c","d","e"]
row#9 = ["q","w","e","r","t"]
row#44= ["z","x","c","v","b"]

и columns_idx равен 3, я хочу вектор с "d" в индексах 0-5, "r" в индексах 5-9 и "v" в индексах 9-44 и nan в индексах 44+.Каков наилучший способ сделать это?

1 Ответ

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

Решение работает, если по умолчанию RangeIndex - преобразовать все значения вне indexes es в NaN и значения обратной заливки:

indexes = [5,9,44]
columns_idx = 3

out = df.iloc[:, columns_idx].where(df.index.isin(indexes)).bfill()

Другое решение:

df.iloc[:, columns_idx] = df.iloc[indexes, columns_idx]
out = df.iloc[:, columns_idx].bfill()

Образец :

np.random.seed(343)
df = pd.DataFrame(np.random.randint(100, size=(20, 5)), columns=list('abcde'))
print(df)
     a   b   c   d   e
0   63  18  56  22  50
1   22  12   4  38  23
2   65  19   2  13  51
3   43  90  46  44  36
4   74  43  92  34  18
5   39  24  62  21   5
6   19  90  51  79  77
7    3   0  51  26  22
8   36  54  25  22   4
9    5  66  76  98  65
10  42  95  89  49  98
11  84  82  88  87  35
12  63  58  17  72  92
13  78  47  71  23   3
14  37  60  82  96  66
15  18  83  93  82  82
16  34  77   2  50  17
17  63   8  78  74  89
18  25  86  83  42  77
19  82  35  77  46  42

indexes = [5,9,14]
columns_idx = 3

out = df.iloc[:, columns_idx].where(df.index.isin(indexes)).bfill()
print (out)
0     21.0
1     21.0
2     21.0
3     21.0
4     21.0
5     21.0
6     98.0
7     98.0
8     98.0
9     98.0
10    96.0
11    96.0
12    96.0
13    96.0
14    96.0
15     NaN
16     NaN
17     NaN
18     NaN
19     NaN
Name: d, dtype: float64

Объяснение :

Сравнить значения индекса для True для индексов с indexes сisin:

print (df.index.isin(indexes))
[False False False False False  True False False False  True False False
 False False  True False False False False False]

Выбор столбца по позиции с помощью DataFrame.iloc:

print (df.iloc[:, columns_idx])
0     22
1     38
2     13
3     44
4     34
5     21
6     79
7     26
8     22
9     98
10    49
11    87
12    72
13    23
14    96
15    82
16    50
17    74
18    42
19    46
Name: d, dtype: int32

Замена несопоставленных значений на where:

print (df.iloc[:, columns_idx].where(df.index.isin(indexes)))
0      NaN
1      NaN
2      NaN
3      NaN
4      NaN
5     21.0
6      NaN
7      NaN
8      NaN
9     98.0
10     NaN
11     NaN
12     NaN
13     NaN
14    96.0
15     NaN
16     NaN
17     NaN
18     NaN
19     NaN
Name: d, dtype: float64

И пропущенные значения последнего обратного заполнения:

print (df.iloc[:, columns_idx].where(df.index.isin(indexes)).bfill())
0     21.0
1     21.0
2     21.0
3     21.0
4     21.0
5     21.0
6     98.0
7     98.0
8     98.0
9     98.0
10    96.0
11    96.0
12    96.0
13    96.0
14    96.0
15     NaN
16     NaN
17     NaN
18     NaN
19     NaN
Name: d, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...