Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换具有不同大小和多个条件的数据帧之间的值_Python_Pandas_Dataframe - Fatal编程技术网

Python 替换具有不同大小和多个条件的数据帧之间的值

Python 替换具有不同大小和多个条件的数据帧之间的值,python,pandas,dataframe,Python,Pandas,Dataframe,因此,我有两个数据帧,大小不同,df1=(578,81)和df2=(1500,59),df1上的所有行都存在于df2中,df2中的所有列都存在于df1中,我的问题是,我想根据6个条件更新df1中的值,以便更新列X,在两个数据帧上,X1、X2、Y1、Y2、Z1和Z2列的值必须相等 在java上,我会做一些事情,比如: for(i=0;i<df1.length;i++){ for(k=0;k<df2.length;k++){ if(df1[i][1]==df2[k

因此,我有两个数据帧,大小不同,
df1=(578,81)
df2=(1500,59)
,df1上的所有行都存在于df2中,
df2中的所有列都存在于df1
中,我的问题是,我想根据
6个条件更新df1中的值,以便更新
列X
,在两个数据帧上,
X1、X2、Y1、Y2、Z1和Z2列的值必须相等

在java上,我会做一些事情,比如:

for(i=0;i<df1.length;i++){
    for(k=0;k<df2.length;k++){
        if(df1[i][1]==df2[k][1] && df1[i][2]==df2[k][2] ...){
            df1[i][0] = df2[k][0];
    }
}

for(i=0;i6列是否使行唯一?
如果是,我将使用合并:

columns_join= ['col1', 'col2', 'col3', 'col4', 'col5', 'col6']
columns_update= ['upd1', 'upd2', 'upd3']

df_merged= df_to_update[columns_join].merge(df_source[columns_join + columns_update], on=columns_join, how='left', suffixes=['', '_src'], indicator='_join_ind')

for col in columns_update:
    df_to_update.loc[df_merged['_join_ind']=='both', col]= df_merged[col + '_src']

# now df_to_update contains the result
如果这6个字段没有标识一行(可能会导致更多行),则需要在以后使合并结果唯一,但在这种情况下,Java版本也将始终生成最后一行的值。 在这种情况下,您可以使用
DataFrame.grouby
和例如
last
作为聚合函数

编辑:如果您需要应用聚合,最好将聚合应用于您获取值的数据帧。要使用每个组的最后一个值对其进行相应的聚合并在之后进行合并,只需将行替换为上面的
。通过以下方式合并

df_agg= df_source.groupby(columns_join)[columns_update].aggregate('last')
df_merged= df_to_update[columns_join].merge(df_source[columns_join + columns_update], left_on=columns_join, right_index=True, how='left', suffixes=['', '_src'], indicator='_join_ind')

您可以轻松地使用
numpy.where
。我认为它在这种情况下也应该工作得最好

假设您有以下数据帧

import pandas as pd

df1=pd.DataFrame({'X':[1,3,4,6,5],
                  'X1':[2,3,4,6,3],
                  'Y1':[4,2,1,51,3],
                  'Z1':[2,3,4,1,5]})

df2=pd.DataFrame({'L':[2,3,4,1,4],
                  'X2':[2,3,4,6,5],
                  'Y2':[4,3,4,6,3],
                  'Z2':[2,2,1,51,3]})

如果
X1==X2&Y1==Y2&Z1==Z2
,则需要根据条件更改X的值。在这种情况下,还可以假设要更新的值来自列L

您可以像这样使用
numpy.where

df1['X']=np.where((df1['X1']==df2['X2'])&(df1['Y1']==df2['Y2'])&(df1['Z1']==df2['Z2']),df2['L'],,df1['X'])
它只会更改第一行,因为那里只满足条件。如果满足条件,此函数将值更改为
df2['L']
,如果不满足条件,则保留原始值

阅读更多关于

更新:问题中的数据帧不相等。它们的列是否相等无关紧要,但为了进行比较,行应该相等。下面是两个数据帧不相等的示例以及如何
numpy。在这种情况下,
在何处执行。

import pandas as pd
import numpy as np

df1=pd.DataFrame({'X':[1,3,4,6,5],
                  'X1':[2,3,4,6,3],
                  'Y1':[4,3,1,51,3],
                  'Z1':[2,3,4,1,5]})

df2=pd.DataFrame({'L':[2,3,4,1,4,5,1],
                  'X2':[2,3,4,6,5,2,3],
                  'Y2':[4,3,4,6,3,8,7],
                  'Z2':[2,3,1,51,3,9,9],
                  'R2':[2,5,1,2,7,3,9]})

#make both the dataframes equal

for i in range(len(df2)-len(df1)):
    df1=df1.append(pd.Series(),ignore_index=True)

df1['X']=np.where((df1['X1']==df2['X2'])&(df1['Y1']==df2['Y2'])&(df1['Z1']==df2['Z2']),df2['L'],df1['X'])

#drop those null values which have been appended above to get back to original
df1=df1.dropna(how='all')    


请查看并为您的问题提供一个示例输入和输出数据,以便我们能够提供更具体的帮助。我不知道如何做到这一点,因此我无法提供一个可复制的示例,我将从csv文件加载数据帧,这是我所能得到的。嗨,Pablo,您可以从csv中复制一些行。我得到一个错误:Valuerror:只能比较标签相同的系列对象,我在尝试使用掩码时遇到了相同的错误。请检查更新的答案!发生错误的原因是两个数据帧中的行不相等。建议的解决方案是向数据帧添加一些空值以使其相等,然后删除这些值。此外,您应该复制并粘贴一些行如果您的excel文件不是机密文件,则可以从中查看,以便让我们更好地了解您希望实现的目标。如果数据是机密文件,您也可以更改值。我相信您的答案是逐行比较,这不起作用,我必须搜索df2以查找匹配项,并更新X以查找匹配项,例如,df1的第1行是匹配项w对于df2的第3行,df1是一个经过过滤的df2,删除了坏行。为了将来的使用,我认为它缺少列_updateon on=,我认为这是我的解决方案,但我得到了一个关键错误,缺少2个索引,前10行的值相等,这可能是针对一些不匹配的行?但每个sin都应该有一个匹配谢谢。你的权利,首先我在那个地方使用了列表而不是变量。所以我发现了错误,列名在其中一个数据帧中多了两个空格,但是我仍然在我要更新的de列上得到了一个键丢失的错误,我检查了,它们是正确的。我丢失了。你尝试了什么,你得到了什么错误?你有没有发现是否另外应用我在上面提出的聚合?