我有两个类似这样的CSV文件,希望通过匹配两个数据帧中的列(test,cond),在df2(LL,UL)的基础上更新df1列(LL,UL)
df1:
test Cond day mode LL UL
a T1 Tue 7
b T2 mon 7
c T2 sun 6
d T3 fri 3
c T2 sat 6
d T3 wed 3
df2:-
test Cond LL UL
a T1 15 23
b T2 -3 -3.5
c T2 -19 -11
d T3 6.5 14.5
我的预期产出应该是:-
def SpecsLL(cond1,test1):
if ((cond1==spec['Cond'] ) & (test1==spec['test'])):
return df2['LL']
df1['LL'] = df1.apply(lambda x: SpecsLL(x['Cond'],x['test']),axis=1)
我尝试了上述代码,但没有成功。
有什么办法吗
只需使用熊猫的合并功能
方法1:
combine_first
说明:
set_index
将指定的列移动到索引中,表示每一行都应该由其test
和Cond
列标识李>foo.combine_first(bar)
将标识foo
和bar
之间匹配的索引+列标签,并在foo
为NaN或缺少列/行的地方填充bar
中的值。在这种情况下,由于set_index
,两个数据帧的行将匹配,其中test
和Cond
是相同的,然后df2
中的UL
和LL
值将填充到输出的相应列中李>reset_index
简单地反转set_index
调用,以便test
和Cond
再次成为正则列李>请注意,此操作可能会破坏列的顺序,因此,如果这对您很重要,那么您可以在最后调用
.reindex(df1.columns, axis=1)
,这将按df1
中的原始顺序重新排列列方法2:
merge
或者,您可以使用
merge
方法,该方法允许您在不使用set_index
的情况下直接对列进行操作,但需要一些其他预处理:.drop
调用是必需的,因为否则merge
将在输出中包括来自两个数据帧的UL
和LL
列:使用哪个
对于您提供的数据,
merge
似乎是更自然的操作-如果您从不期望UL和LL在df1
中有任何数据,那么如果可能的话,我建议只从输入CSV中完全删除这些列标题,这样df1
就根本没有这些列。在这种情况下,drop
调用将不再是必需的,并且所需的merge
调用非常有表现力但是,如果您期望
df1
有时会有UL
或LL
的实际值,并且希望在输出中包含这些值,那么combine_first
解决方案就是您想要的。请注意,如果df1
和df2
对于特定行/列具有不同的非空值,则df1.combine_first(df2)
将从df1
中选择值并忽略df2
值。如果您想对来自df2
的值进行优先级排序,那么您想反过来调用它,即df2.combine_first(df1)
相关问题 更多 >
编程相关推荐