Найти индекс каждой строки столбца в другой столбец в Pandas - PullRequest
0 голосов
/ 16 октября 2018

Pandas noob здесь .. Не удалось найти ответ в SO.Любая помощь очень ценится.

У меня есть DataFrame, который имеет 2 столбца.Один столбец - это просто значение, а другой столбец - это скользящее Min () из предыдущих 5 значений первого столбца.

+-------+-------+------+ 
| Index | Value | Min5 | 
+-------+-------+------+
|     0 |   1.5 |  1.5 |
|     1 |     1 |    1 |
|     2 |   0.8 |  0.8 |
|     3 |     2 |  0.8 |   --> Ex."0.8" is the min of (1.5, 1, 0.8, 2)
|     4 |   1.3 |  0.8 |
|     5 |   0.9 |  0.8 |
|     6 |     1 |  0.8 |
|     7 |   1.3 |  0.9 |
|     8 |   0.5 |  0.5 |
|     9 |   1.7 |  0.5 |
|    10 |   2.1 |  0.5 |
+-------+-------+------+

Я хотел бы создать столбец, в котором будет указано, сколько строк назад былопоявилось текущее значение Min.Моя цель - закончить DataFrame следующим образом:

+-------+-------+------+----------+
| Index | Value | Min5 | Distance |
+-------+-------+------+----------+
|     0 |   1.5 |  1.5 |        0 |
|     1 |     1 |    1 |        0 |
|     2 |   0.8 |  0.8 |        0 |
|     3 |     2 |  0.8 |        1 |
|     4 |   1.3 |  0.8 |        2 |  --> Ex. 0.8 is 2 rows away (up)
|     5 |   0.9 |  0.8 |        3 |
|     6 |     1 |  0.8 |        4 |
|     7 |   1.3 |  0.9 |        2 |
|     8 |   0.5 |  0.5 |        0 |
|     9 |   1.7 |  0.5 |        1 |
|    10 |   2.1 |  0.5 |        2 |
+-------+-------+------+----------+

Спасибо!

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы также можете сделать rolling np.argmin

df.Value.rolling(5, min_periods=1).apply(lambda s: np.argmin(s[::-1]), raw=True).astype(int)

0     0
1     0
2     0
3     1
4     2
5     3
6     4
7     2
8     0
9     1
10    2
Name: Value, dtype: int64
0 голосов
/ 16 октября 2018

Я нашел pandas.DataFrame.idxmax работает.

# create the Value column with index in range(len(Value))
import pandas as pd
Value = [1.5, 1, 0.8, 2, 1.3, 0.9, 1, 1.3, 0.5, 1.7, 2.1]
df = pd.DataFrame({
    'Value': Value,
})

# Calculate values for the Min5 column
cal_Min5 = lambda x: [min(x[0: i + 1]) if i < 4 else min(x[i - 4: i + 1]) for i in range(len(x))]
df['Min5'] = cal_Min5(Value)

# Calculate values for the Distance column using the idxmax() method
cal_Distance =lambda x: [i - (x == x[i]).idxmax() for i in range(len(x))]
df['Distance'] = cal_Distance(df['Min5'])
print(df)

Это выводит:

    Value  Min5  Distance
0     1.5   1.5         0
1     1.0   1.0         0
2     0.8   0.8         0
3     2.0   0.8         1
4     1.3   0.8         2
5     0.9   0.8         3
6     1.0   0.8         4
7     1.3   0.9         0
8     0.5   0.5         0
9     1.7   0.5         1
10    2.1   0.5         2
0 голосов
/ 16 октября 2018

Вы ищете idxmin

df.index-df.Value.rolling(5,min_periods=1).apply(pd.Series.idxmin,raw=False)

Out[27]: 
0     0.0
1     0.0
2     0.0
3     1.0
4     2.0
5     3.0
6     4.0
7     2.0
8     0.0
9     1.0
10    2.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...