我目前正在从事一个爱好项目,但是我一直坚持在熊猫中填充DataFrame。我有三个数据框。我的问题:
id
中的每个DataFrame1
,如果列n
等于{{1,则将列x
添加到DataFrame3
中的列m
}}。1
和id
中的每个DataFrame1
,如果DataFrame2
中的列y
相等,则将列1
设置为c
到DataFrame1
或1
中的列d
等于DataFrame2
。等于1
的{{1}}具有最高优先级,并将c
设置为99
有人可以帮助我吗?
y
答案 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