我有一个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_status
和f_status
是 WO 方案2 条件(第3行和第4行):
svc_no
不等于caller_id
svc_no
位于caller_id
中,反之亦然svc_no
中的值与 n / a 匹配,而caller_id
中其对的值与 NULL i_status
和f_status
为FA,且值为 NULL 或 n / a 方案3 条件(第5行和第6行):
svc_no
不等于caller_id
svc_no
是6个数字字符caller_id
是 new_num i_status
和f_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个符合条件的行分组?还是我的代码周围有一种方法可以将它们应用于受影响的特定行?
答案 0 :(得分:0)
我这样做是为了回答: 我在下面的每一行中使用了df.loc。
我能够在不将包含转置值的两行进行分组的情况下实现输出。
在(df['svc_no']isint(df['caller_id']))
行中,我确定该值是否存在于svc_no
的{{1}}中,并为另一行创建了另一个df.loc。
场景1 :
caller_id
我认为这是解决问题的方法,因此我会将其应用于其他情况。