Получение данных из одного столбца на основе значения другого столбца - PullRequest
0 голосов
/ 20 мая 2018

У меня возникли проблемы при разработке алгоритма для следующей задачи: у меня есть два фрейма данных, df1 и df2 (ниже приведен только пример):

import pandas as pd
df1 = pd.DataFrame({'Col1': [1, 7, 10, 50, 73, 80 ], 'Col2': [1,2,3,4,5,6]})
df2 = pd.DataFrame({'Col1': [0, 4, 10, 80], 'Col3': [7,6,8,9]})

Как видите, ониу обоих есть Col1, но значения не всегда совпадают, но в порядке возрастания.Я хочу создать функцию, которая создаст новый столбец на df1, назовем его Col4.Значения в этом столбце должны быть получены из df2 в соответствии с этими правилами:

1) Если df1 и df2 имеют одинаковое значение в Col1, значение в Col4 должно быть соответствующим значением в Col3.

2) Если они не разделяют одно и то же значение в Col1, Col4 должно быть средним между значениями в Col3, которые соответствуют значениям непосредственно до и после него.

Например:

Asdf2 не имеет значения в Col1 для 1, первая запись в Col4 должна быть в среднем от 7 до 6 (1 от 0 до 4).

Я не знаю, ясно ли я высказался, но окончательный результат для Col4 должен быть:

(7 + 6) / 2, (6 + 8) / 2, 8, (8 + 9) / 2, (8 + 9) / 2,9

Было бы неплохо иметь функцию, потому что мне придется выполнять эту операцию для множества различных фреймов данных.

Я знаю, что это странная проблема, но спасибо за помощь!

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете достичь желаемого с помощью pandas.merge_asof

Вы объединяете df1 с df2 на Col1 в обоих направлениях, forward и backward.Тогда вы просто усредняете результаты.Я объединил два слияния в один df по столбцам и переименовал столбцы, чтобы они не совпадали с именами.

import pandas as pd

df = pd.concat([pd.merge_asof(df1, df2, on='Col1').rename(columns={'Col3': 'Col4_1'}), 
                pd.merge_asof(df1, df2, on='Col1', direction='forward')[['Col3']].rename(columns={'Col3': 'Col4_2'})], axis=1)

print(df)
#   Col1  Col2  Col4_1  Col4_2
#0     1     1       7       6
#1     7     2       6       8
#2    10     3       8       8
#3    50     4       8       9
#4    73     5       8       9
#5    80     6       9       9

# Calculate the average you want, drop helper columns.
df['Col4'] = (df.Col4_1 + df.Col4_2)/2
df.drop(columns=['Col4_1', 'Col4_2'], inplace=True)

print(df)
#   Col1  Col2  Col4
#0     1     1   6.5
#1     7     2   7.0
#2    10     3   8.0
#3    50     4   8.5
#4    73     5   8.5
#5    80     6   9.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...