Python использует номер ранга для выбора значения между двумя кадрами - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два кадра данных, как показано ниже. Я хочу добавить один столбец в фрейм данных df2. Используя df2['date'] и df2['ranking'] число, чтобы выбрать значение в кадре данных df, например, в df2 нулевая строка строки - 20130101, ранжирование - 3, выберите третье по величине число в кадре данных df в нулевой строке (они имеют в ту же дату) и вернуть 0,24. Как мне получить последний вывод данных из фрейма, который я добавил как последний?

import pandas as pd
import numpy as np
df = pd.DataFrame({
    'date': [20130101,20130102, 20130103, 20130104, 20130105, 20130106],
    'part1':[-0.17,-1.03,1.59,-0.05,-0.1,0.9],
     'part2':[0.67,-0.03,1.95,-3.25,-0.3,0.6],
     'part3':[0.7,-3,1.5,-0.25,-0.37,0.62],
     'part4':[0.24,-0.44,1.335,-0.45,-0.57,0.92]
})
df2 = pd.DataFrame({
    'date': [20130101,20130102, 20130103, 20130104, 20130105, 20130106],
    'ranking': [3, 4, 1, 4, 2, 3]
})
       date  output  ranking
0  20130101    0.24        3
1  20130102   -3.00        4
2  20130103    1.95        1
3  20130104   -3.25        4
4  20130105   -0.30        2
5  20130106    0.62        3

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Использование:

print (df)
       date  part1  part2  part3  part4
0  20130101  -0.17   0.67   0.70  0.240
1  20130102  -1.03  -0.03  -3.00 -0.440
2  20130103   1.59   1.95   1.50  1.335
3  20130104  -0.05  -3.25  -0.25 -0.450
4  20130105  -0.10  -0.30  -0.37 -0.570
5  20130107   0.90   0.60   0.62  0.920 <-not matched date

Сначала объедините оба DataFrames вместе merge с левым объединением:

df1 = df2.merge(df, on='date', how='left')
print (df1)
       date  ranking  part1  part2  part3  part4
0  20130101        3  -0.17   0.67   0.70  0.240
1  20130102        4  -1.03  -0.03  -3.00 -0.440
2  20130103        1   1.59   1.95   1.50  1.335
3  20130104        4  -0.05  -3.25  -0.25 -0.450
4  20130105        2  -0.10  -0.30  -0.37 -0.570
5  20130106        3    NaN    NaN    NaN    NaN

Получить столбцы для поиска значений по ranking столбец с numpy.argsort:

cols = df1.columns.difference(df2.columns)

a = np.argsort(-df1[cols].values, axis=1)[np.arange(len(df1)), df1['ranking'].sub(1)]
df1['new'] = df1[cols].values[np.arange(len(df1)), a]

Удалить ненужные столбцы:

df1 = df1.drop(cols, axis=1)
print (df1)
       date  ranking   new
0  20130101        3  0.24
1  20130102        4 -3.00
2  20130103        1  1.95
3  20130104        4 -3.25
4  20130105        2 -0.30
5  20130106        3   NaN
0 голосов
/ 12 сентября 2018
def rank_output(row):
    row_sorted = sorted(row[['part1', 'part2', 'part3', 'part4']], reverse=True)
    return row_sorted[int(row['ranking']) - 1]

df['ranking'] = df2['ranking']

df['output'] = df[['part1', 'part2', 'part3', 'part4', 'ranking']].apply(rank_output, axis=1)

df = df[['date', 'output', 'ranking']]

Это должно быть то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...