![](/img/trans.png)
[英]Pandas assign value if value from one dataframe exists in another dataframe
[英]Python Pandas checking for a value if it exists from one DataFrame to another DataFrame
我有一个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
那些, S3 Transpose only
将输入成一行。
有没有一种方法可以将适用条件的2行分组? 还是有一种方法可以将我的代码应用于受影响的特定行?
我的回答是:我在下面的每一行中使用了df.loc。
我能够实现输出而无需将包含转置值的两行分组。
在(df['svc_no']isint(df['caller_id']))
,我确定该值是否存在于svc_no
的caller_id
并为另一行创建了另一个df.loc
场景1 :
df.loc[(c_merge['svc_no'] != 'NULL') & /
(df['i_status'] == 'WO') & /
(df['caller_id'] != 'n/a') & /
(df['f_status'] == 'WO') & /
(df['svc_no'] != df['caller_id']) & /
(df['svc_no'].isin(df['caller_id'])), ['remarks']] = 'S1 Transpose'
df.loc[(c_merge['svc_no'] != 'NULL') & /
(df['i_status'] == 'WO') & /
(df['caller_id'] != 'n/a') & /
(df['f_status'] == 'WO') & /
(df['svc_no'] != df['caller_id']) & /
(df['caller_id'].isin(df['svc_no'])), ['remarks']] = 'S1 Transpose'
我将其应用于其他情况,因为我认为这是解决问题的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.