Python Pandas检查值是否从一个DataFrame到另一个DataFrame

时间:2018-07-14 13:09:01

标签: python pandas

我有一个Excel文件,其中每个列都用作DataFrame。这是我正在使用的5个数据框-( 我将添加一个行号列,以便在我的问题中更清楚地说明。它不包含在原始文件中 ):

row_no   svc_no   i_status   caller_id   f_status   remarks
1        11111    WO         22222       WO
2        22222    WO         11111       WO

3        33333    WO         n/a         FA
4        NULL     FA         33333       WO

5        444444   WO         55555       WO
6        55555    WO         new_num     WO

满足条件后,我需要在remarks列中输入一个值。在这种情况下,有3种情况,每种情况都有不同的条件。

注意:每个数据的行可能会有所不同,但以我的示例为例,我将它们连续放置

场景1 条件(第1行和第2行):

  • svc_no不等于caller_id
  • svc_no不是 NULL
  • caller_id不是 n / a
  • svc_no位于caller_id中,反之亦然
  • i_statusf_status WO

方案2 条件(第3行和第4行):

  • svc_no不等于caller_id
  • svc_no位于caller_id中,反之亦然
  • svc_no中的值与 n / a 匹配,而caller_id中其对的值与 NULL
  • 匹配
  • 如果i_statusf_status为FA,且值为 NULL n / a

方案3 条件(第5行和第6行):

  • svc_no不等于caller_id
  • svc_no是6个数字字符
  • caller_id new_num
  • i_statusf_status WO
  • svc_no位于caller_id中,反之亦然

现在让我们说我满足每种情况的条件,我将不得不在备注中输入一个指定的值。所以我想要的输出是:

row_no   svc_no   i_status   caller_id   f_status   remarks
1        11111    WO         22222       WO         S1 Transpose
2        22222    WO         11111       WO         S1 Transpose

3        33333    WO         n/a         FA         S2 Transpose
4        NULL     FA         33333       WO         S2 Transpose

5        444444   WO         55555       WO         S3 Transpose
6        55555    WO         new_num     WO         S3 Transpose

我的问题是,即使我的代码可以正常工作并且符合条件,输出也不准确。这是我的代码:

# Scenario 1

df.loc[(df['svc_no'] != df['caller_id']) &
       (df['svc_no'].isin(df['caller_id'])) &
       (df['caller_id'].isin(df['svc_no'])) &
       (df['svc_no'] != 'NULL') &
       (df['caller_id'] != 'n/a') &
       (df['i_status'] == 'WO') &
       (df['f_status'] == 'WO'), ['remarks']] = 'S1 Transpose'

# Scenario 2
# NULL svc_no
df.loc[(df['svc_no'] == 'NULL') &
       (df['caller_id'] !='n/a') &
       (df['svc_no'].isin(df['caller_id'])) &
       (df['caller_id'].isin(df['svc_no'])) &
       (df['i_status'] == 'FA') &
       (df['f_status'] == 'WO')['remarks']] = 'S2 Transpose'

# n/a in caller_id
df.loc[(df['svc_no'] != 'NULL') &
       (df['caller_id'] =='n/a') &
       (df['svc_no'].isin(df['caller_id'])) &
       (df['caller_id'].isin(df['svc_no'])) &
       (df['i_status'] == 'WO') &
       (df['f_status'] == 'FA')['remarks']] = 'S2 Transpose'

# Scenario 3
df.loc[(c_merge['svc_no'] != 'NULL') &
       (df['svc_no'].isin(c_merge['caller_id'])) &
       (df['caller_id'].isin(c_merge['svc_no'])) &
       (df['i_status'] == 'WO') &
       (df['caller_id'] != c_merge['svc_no']) &
       (df['f_status'] == 'WO') &
       (df['caller_id'] == 'new_num', ['remarks']] = s3_wo_wo

我的输出是:

row_no   svc_no   i_status   caller_id   f_status   remarks
1        11111    WO         22222       WO         S1 Transpose
2        22222    WO         11111       WO         S1 Transpose

3        33333    WO         n/a         FA         S1 Transpose
4        NULL     FA         33333       WO         S1 Transpose

5        444444   WO         55555       WO         
6        55555    WO         new_num     WO         S3 Transpose

S1 Transpose还将S2 Transpose中的内容输入,并将S3 Transpose only中的内容输入一行。

有没有一种方法可以将2个符合条件的行分组?还是我的代码周围有一种方法可以将它们应用于受影响的特定行?

1 个答案:

答案 0 :(得分:0)

我这样做是为了回答: 我在下面的每一行中使用了df.loc。

我能够在不将包含转置值的两行进行分组的情况下实现输出。

(df['svc_no']isint(df['caller_id']))行中,我确定该值是否存在于svc_no的{​​{1}}中,并为另一行创建了另一个df.loc。

场景1

caller_id

我认为这是解决问题的方法,因此我会将其应用于其他情况。