Панды соответствуют двум столбцам и создают другой столбец - PullRequest
0 голосов
/ 12 января 2019

У меня есть кадр данных со столбцами A, B, C. Я хочу сравнить столбцы B и C и создать два столбца: A-1 (текущий год строки -1) и A-2 (текущий год строки -2) где A - столбец года.

Пример. В кадре данных за 1971 год столбец B содержит яблоко, апельсин и в колонке C - только яблоко, а в 1970 году - B-банан, яблоко и C-яблоко Теперь для каждой строки в 1971 году мы пытаемся сгенерировать значения для столбца A-1 (1970), A-2 (1969). В году (A-1) 1970 года яблоко отражается в столбцах B, C, поэтому мы Отметьте «да» для первых двух строк 1971 года, затем для третьего ряда он помечается как «нет», поскольку в 1970 году нет оранжевого цвета.

Таким образом, для каждой строки мы рассматриваем год (скажем, 1971) и проверяем значения B и C и видим, фиксируется ли это конкретное значение B в столбце C в год-1 (1970) и год-2 (1969, в этом случае это будет nan, так как мы не записываем ни одной записи с 1969 в нашем фрейме данных) и помечаем их соответственно.

фрейм данных:

 A          B          C       D
1971       apple    apple      yes
1971       apple    apple      yes
1971       orange   nan        no
1970       banana   nan        no
1970       apple    apple      yes
1972       mango    mango      yes
1972       banana   banana     yes
1972       orange   orange     yes
1972       apple    apple      yes
1973       banana    nan       no
1973       mango     mango     yes
1973       apple     nan       no
1974       orange    nan       no

выход: * +1010 *

 A          B          C       A-1    A-2
1971       apple    apple      yes    nan
1971       apple    apple      yes    nan
1971       orange   nan        no     nan
1970       banana   nan        nan    nan
1970       apple    apple      nan    nan
1972       mango    mango      no     no 
1972       banana   banana     no     no
1972       orange   orange     no     no
1972       apple    apple      no     no
1973       banana    nan       yes    no
1973       mango     mango     yes    no
1973       apple     nan       yes    yes
1974       orange    nan       no     yes

Не могу понять, пожалуйста, помогите мне в этом.

1 Ответ

0 голосов
/ 12 января 2019
df = pd.DataFrame(
    {'A': [1971,1971,1971,1970,1970,1972,1972,1972,1972,1973,1973,1973,1974], 
     'B': ['apple', 'apple', 'orange', 'banana', 'apple', 'mango', 'banana', 'orange', 'apple', 'banana', 'mango', 'apple', 'orange'],
     'C': ['apple', 'apple', 'nan', 'nan', 'apple', 'mango', 'banana', 'orange', 'apple', 'nan', 'mango', 'nan', 'nan'],
    })

fruits_by_year = df[df.C!='nan'].groupby('A')['C'].apply(set).to_dict()

def get_A_minus_n(x, n):
    if x.A-n not in fruits_by_year:
        return 'nan'
    elif x.B in fruits_by_year[x.A-n]:
        return 'yes'
    else:
        return 'no'

df['A-1'] = df.apply(lambda x: get_A_minus_n(x, 1), axis=1)
df['A-2'] = df.apply(lambda x: get_A_minus_n(x, 2), axis=1)

Давайте сначала создадим диктовку с именем fruits_by_year:

  1. отбросить строки, у которых 'C' равно 'nan'

  2. сгруппировать по столбцу 'A' и получить их значения в столбце 'C'

  3. преобразование значений в набор

  4. преобразовать все результаты в диктовку

Должно быть:

{1970: {'apple'}, 1971: {'apple'}, 1972: {'apple', 'banana', «манго», «апельсин»}, 1973: {«манго»}}

А затем создайте два новых столбца. Нам нужно:

  1. построить функцию get_A_minus_n, которая возвращает различное значение в 3 разных случаях

  2. применить эту функцию к каждой строке DataFrame

Примечание: 9-й ряд 'A-1', 'A-2' должен быть 'yes', 'yes'

...