![](/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.