我有3个数据框,如下所示:
df1
:
id c1
1 aa
2 aa
3 xx
4 xx
5 yy
df2
:
id c1
1 aa
2 xx
3 aa
4 yy
5 xx
df3
:
id c1
1 xx
2 xx
3 aa
4 yy
5 aa
我要根据以下条件创建一个新的数据框df4
:
df4
将包含多数值(例如:两个数据帧表示该值应为aa where id = 1
,因此df4
将在ID 1处包含aa
如果所有数据帧都包含唯一值,那么将选择df1
的值(例如,id 5时,所有3个数据帧都包含不同的值,即yy,xx,aa但df1
包含yy
,因此会选择yy
预期输出:
`df4`:
id c1
1 aa
2 xx
3 aa
4 yy
5 yy
答案 0 :(得分:2)
这应该实现您想要的。我们尝试找到给定行的mode
,如果失败,则从第一个数据帧中获取项目。然后我们将此功能逐行应用于连接的数据帧,以实现所需的结果。
from statistics import StatisticsError, mode
def maybe_mode(row):
try:
v = mode(row)
except StatisticsError:
v = row.iloc[0]
return v
df4 = pd.DataFrame(df1.id)
df4['c1'] = pd.concat([df1, df2, df3], axis=1).c1.apply(maybe_mode, axis=1)
print(df4)
id c1
0 1 aa
1 2 xx
2 3 aa
3 4 yy
4 5 yy
答案 1 :(得分:0)
我现在才想到这一点,但这不是一个很好的选择。 因为,如果我们添加更多数据框,我们需要修改所有代码 时间混乱,因为有两个循环
col = df1['surface'].unique()
df4 = df1
for i in range (len(col)):
for j in range (len(df1)):
if (df1['surface'][j] == col[i] and df2['surface'][j] == col[i]):
df4['surface'][j] = col[i]
elif (df2['surface'][j] == col[i] and df3['surface'][j] == col[i]):
df4['surface'][j] = col[i]
elif (df1['surface'][j] == col[i] and df3['surface'][j] == col[i]):
df4['surface'][j] = col[i]
elif (df2['surface'][j] == col[i] and df2['surface'][j] != df3['surface'][j]):
df4['surface'][j] = col[i]