Как заполнить панды DataFrame на основе нескольких столбцов и условий? - PullRequest
0 голосов
/ 12 апреля 2019

В настоящее время я работаю над проектом хобби, но я застрял в заполнении DataFrame в пандах. У меня есть три DataFrames. Мои проблемы:

  • Для каждого id в DataFrame1 добавьте столбец n в столбец x в DataFrame3, если столбец m равен 1.
  • Для каждого id в DataFrame1 и DataFrame2 установить для столбца y значение 1, если столбец c в DataFrame1 равен 1 или если столбец d в DataFrame2 равно 1. c равно 99 имеет наивысший приоритет и устанавливает y на 99

Может кто-нибудь помочь мне?

DataFrame1

    | id     | n    | m | c |
    |--------|------|---|---|
    | 577140 | bla1 | 0 | 0 |
    | 577140 | bla2 | 0 | 0 |
    | 577140 | bla3 | 0 | 0 |
    | 577140 | bla4 | 1 | 0 |
    | 577140 | bla5 | 0 | 1 |
    | 577141 | bla6 | 0 | 0 |
    | 577141 | bla7 | 0 | 0 |
    | 577141 | bla8 | 1 | 0 |

DataFrame2

    | id     | d |
    |--------|---|
    | 577140 | 1 |
    | 577141 | 0 |

DataFrame3 (currently)

    | id     |
    |--------|
    | 577140 |
    | 577141 |

DataFrame3 (needed)

    | id     | x    | y |
    |--------|------|---|
    | 577140 | bla4 | 1 |
    | 577141 | bla8 | 0 |

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Если я вас правильно понимаю, вы хотите использовать цепочку DataFrame.merge дважды, чтобы объединить все 3 кадра данных, и после этого условно сделать столбец y с np.select, который мы можем пройти несколько условий

df_temp = pd.merge(df3, df1[df1.m == 1], on='id').merge(df2, on='id')

# Create column y with multiple conditions
conditions = [
    df_temp['c'] == 99,
    (df_temp['c'] == 1) | (df_temp['d'] == 1)
]

choices = [99, 1]

df_temp['y'] = np.select(conditions, choices, default=0)

# Select only columns we need for output
df_final = df_temp[['id', 'n', 'y']]

print(df_final)
       id     n  y
0  577140  bla4  1
1  577141  bla8  0
0 голосов
/ 12 апреля 2019

Я использовал set для логики "if столбец c в DataFrame1 равен 1 или если столбец d равен 1":

columns = ['id', 'n', 'm', 'c']

df1=pd.DataFrame(
    [[577140, 'bla1', 0, 0],
    [577140, 'bla2', 0, 0],
    [577140, 'bla3', 0, 0],
    [577140, 'bla4', 1, 0],
    [577140, 'bla5', 0, 1],
    [577141, 'bla6', 0, 0],
    [577141, 'bla7', 0, 0],
    [577141, 'bla8', 1, 0]], columns=columns)

df3 = df1.loc[df1.m == 1, ['id', 'n']]
df3.columns = ['id', 'x']

df2 = pd.DataFrame([[577140, 1], [577141, 0]], columns=['id', 'd'])

id_set = set([df1[df1.c == 1]['id'].values[0], df2[df2.d == 1]['id'].values[0]])

df3['y'] = 0

df3.loc[df3.id.isin(id_set), 'y'] = 1
0 голосов
/ 12 апреля 2019

Попробуйте использовать merge:

DataFrame3 = DataFrame3.merge(DataFrame1, how='left')
DataFrame3 = DataFrame3.merge(DataFrame2, how='left')
DataFrame3 = DataFrame3.rename(columns={'n': 'x'})
DataFrame3 = DataFrame3[DataFrame3['m'] == 1]
DataFrame3['y'] = (DataFrame3['c'] | DataFrame3['d'])
DataFrame3.drop(columns=['c', 'd', 'm'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...