如何混合包含字符串值的多个数据框

时间:2019-03-23 15:46:50

标签: python pandas dataframe

我有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

2 个答案:

答案 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]