如何基于多个列和条件填充pandas数据帧?

2024-09-30 07:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个业余爱好项目,但我还是坚持在pandas中填充一个数据帧。我有三个数据帧。我的问题:

  • 对于DataFrame1中的每个id,如果列m等于1,则将列n添加到DataFrame3中的x。在
  • 对于DataFrame1DataFrame2中的每个id,如果DataFrame1中的列c等于1,或者{}中的列d等于{}。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 |

Tags: 数据项目idpandas帮帮我dataframe1dataframe2bla2
3条回答

如果我理解正确的话,您需要两次使用^{}连接所有3个数据帧,然后有条件地使y列与{a2}一起,我们可以传递多个条件

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

尝试使用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'])

我使用set作为“如果DataFrame1中的c列等于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

相关问题 更多 >

    热门问题