如何基于多个列和条件填充pandas DataFrame?

时间:2019-04-12 14:29:18

标签: python pandas dataframe

我目前正在从事一个爱好项目,但是我一直坚持在熊猫中填充DataFrame。我有三个数据框。我的问题:

  • 对于id中的每个DataFrame1,如果列n等于{{1,则将列x添加到DataFrame3中的列m }}。
  • 对于1id中的每个DataFrame1,如果DataFrame2中的列y相等,则将列1设置为cDataFrame11中的列d等于DataFrame2。等于1的{​​{1}}具有最高优先级,并将c设置为99

有人可以帮助我吗?

y

3 个答案:

答案 0 :(得分:1)

如果我对您的理解是正确的,那么您想链式使用DataFrame.merge两次来连接所有3个数据帧,然后有条件地将y列与np.select一起使用,我们可以传递多个条件< / p>

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

答案 1 :(得分: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'])

答案 2 :(得分:0)

对于“如果DataFrame1中的c列等于1或d列等于1”逻辑,我使用了set

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