我有 2 个相同长度的数据框,我想比较它们之间的特定列。如果其中一个数据帧中第一列的值更大 - 我希望它采用第二列中的值并将其分配给新的数据帧。
参见示例。第一个数据框:
0 class
0 1.9 0
1 9.8 0
2 4.5 0
3 8.1 0
4 1.9 0
第二个数据框:
0 class
0 1.4 1
1 7.8 1
2 8.5 1
3 9.1 1
4 3.9 1
新数据框应如下所示:
class
0 0
1 0
2 1
3 1
4 1
最佳答案
将 numpy.where
与 DataFrame
构造函数一起使用:
df = pd.DataFrame({'class': np.where(df1[0] > df2[0], df1['class'], df2['class'])})
或
DataFrame.where
:df = df1[['class']].where(df1[0] > df2[0], df2[['class']])
print (df)
class
0 0
1 0
2 1
3 1
4 1
编辑:
如果有其他条件,请使用
numpy.select
,如有必要,请使用 numpy.isclose
print (df2)
0 class
0 1.4 1
1 7.8 1
2 8.5 1
3 9.1 1
4 1.9 1
masks = [df1[0] == df2[0], df1[0] > df2[0]]
#if need compare floats in some accuracy
#masks = [np.isclose(df1[0], df2[0]), df1[0] > df2[0]]
vals = ['not_determined', df1['class']]
df = pd.DataFrame({'class': np.select(masks, vals, df2['class'])})
print (df)
class
0 0
1 0
2 1
3 1
4 not_determined
或者:
masks = [df1[0] == df2[0], df1[0] > df2[0]]
vals = ['not_determined', 1]
df = pd.DataFrame({'class': np.select(masks, vals, 1)})
print (df)
class
0 0
1 0
2 1
3 1
4 not_determined
开箱即用的解决方法:
df = np.sign(df1[0].sub(df2[0])).map({1:0, -1:1, 0:'not_determined'}).to_frame('class')
print (df)
class
0 0
1 0
2 1
3 1
4 not_determined
关于pandas - 如何比较 2 个数据帧列并根据结果向新数据帧添加值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57710476/