【问题标题】:Adding a new column from a match on two other data frames从其他两个数据框的匹配项中添加新列
【发布时间】:2021-05-14 21:22:08
【问题描述】:

我尝试从其他两个数据帧 DF1DF2DF 填充一个新字段 Status /strong>。

df = pd.DataFrame({'CODE': ['REP', 'REP', 'NANQUE','NANQUE', 'AB_DEV'], 'name':['AUDI', 'AUDI', 'VW','MER','FIAT']})
df1 = pd.DataFrame({'CODE': ['REP', 'NANQUE','AB_DEV'], 'status':['SORT/QUALT', 'ECHEC','OUTBAND']})
df2 = pd.DataFrame({'name': ['AUDI', 'AUDI','AUDI','VW','VW','MER','FIAT','FIAT','FIAT'], 
                    'status':['SORT', 'SORT','SORT','INCOM','INCOM','INCOM', 'OUTBAND','OUTBAND','OUTBAND'],
                   'CITY':['BOST', 'NY','WC','CH','WC','CH', 'NY','LA','CH']})

这是我的数据框DF

CODE    | name
---------------  
REP     | AUDI
REP     | AUDI
NANQUE  | VW
NANQUE  | MER
AB_DEV  | FIAT

使用以下数据框DF1

完成检查
CODE    | Status
------------------
REP     | SORT/QUAL
NANQUE  | ECHEC
AB_DEV  | OUTBAND
...

满足以下条件:

IF DF['CODE'].isin(DF1['CODE']) and DF1['Status']=='OUTBAND' :
    DF['Status']== 'OUTBAND'

如果不是,则使用以下数据框 DF2

进行第二次检查
name   |    Status  |  CITY
----------------------------
AUDI   |   SORT     |  BOST
AUDI   |   SORT     |   NY
AUDI   |   SORT     |   WC
VW     |  INCOM     |   CH
VW     |  INCOM     |   WC
MER    |  INCOM     |   CH
FIAT   |  OUTBAND   |   NY
FIAT   |  OUTBAND   |   LA
FIAT   |  OUTBAND   |   CH 

满足以下条件:

IF DF['name'] == DF2['name']:
    DF['Status']== DF2['Status']

我试图找到的最终结果

CODE    |  name  |   Status
-------------------------------
REP     |  AUDI  |    SORT
REP     |  AUDI  |    SORT
NANQUE  |   VW   |    INCOM
NANQUE  |   MER  |    INCOM
AB_DEV  |   FIAT |    OUTBAND

我尝试了 np.wehre 但它不起作用。知道如何使它工作吗?

【问题讨论】:

  • @AMC 我试图给出一个可重复的例子,我希望它适合
  • 能否以更方便的格式分享数据,以尽量减少重新创建df所需的工作量?
  • @AMC 我加了很好

标签: python pandas


【解决方案1】:

如果您不介意分几步执行此操作并生成新数据框,则可以使用两个不同的关节来完成:

# I generate some sample data frames to test my answer
df = pd.DataFrame({'CODE': ['A', 'B', 'C'], 'name':['quality', 'sale', 'quality']})
df1 = pd.DataFrame({'CODE': ['A', 'C'], 'status':['outbound', 'outbound']})
df2 = pd.DataFrame({'name': ['sale', 'quality'], 'status':['outbound', 'incoming']})

# Meet the first condition
df_joint = df.set_index('CODE').join(df1[df1.status == 'outbound'].set_index('CODE'), how='left')

# Meet the second condition
df_joint_2 = df_joint.reset_index().set_index('name').join(df2[['name', 'status']].drop_duplicates().set_index('name'), how='left', rsuffix='df2')

# Put indexes in order
df_joint_2 = df_joint_2.reset_index()

# Pass the second conditions to the rows where the first was not met
df_joint_2['status'] = df_joint_2['status'].fillna(df_joint_2.statusdf2) 

# Clean up
df_joint_2.drop(columns=['name', 'statusdf2'], inplace=True)

df_joint_2 是你的输出df。

【讨论】:

  • 感谢您的回答我很感激,但正如我在下面所说的,我不会尝试加入,因为它不符合检查 IF DF['CODE'][i] 的条件== DF1['CODE'][j] and DF1['Status'][j] =='outband' THEN : DF[STATUS][i] = 'outband' Else IF DF['name'][i] = DF2['name'][k] THEN DF[STATUS][i] = DF2[STATUS][k]
  • @wysouf 这些联接确实符合条件:第一个联接满足您的第一个条件,因为联接字段是 CODE (df.CODE == df1.CODE),并且是在 df1 中具有status = 'outbound' (df1.status = 'outbound'),第二个条件在第二个连接中得到满足,因为执行连接的字段是 'name'(意思是 df.name = df2.name)。仔细查看或尝试代码!
  • 我尝试了你的技术,但它不起作用第二次加入发送更多价值,谢谢
  • 它会创建包含更多数据的副本
  • 当然,如果 df2 重复了 name 值,它将为它们中的每一个创建一个匹配项。但是你需要解释在测试第二个条件时你想如何循环你的 df2 。如果您提供更多关于每个 df 的长度和特征的数据,也许我们可以找到解决方案。另一方面,根据创建的副本,您始终可以df_joint_2.drop_duplicates(subset=[...])
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多