簡體   English   中英

熊貓:檢查兩個數據框是否匹配值,然后根據標簽填寫一行

[英]Pandas: Check two dataframes for matching values, then fill a row depending on the label

在大學期間,我主要使用MATLAB作為數學專業,而我的編程只是建立數學方程式和建模。 現在我一直在學習使用Python,尤其是熊貓。 我正在嘗試在一個數據框的一列中搜索值,並將它們與另一個數據框的一列中的值進行匹配。 如果它們確實匹配,我希望它們給原始數據框添加標簽。

例如,我有第一列員工,我想在我的第一個數據幀中找出aliceB是忙還是忙,並在col3中這樣標記。

df1 = {"col1":["aliceA", "aliceB", "aliceC"], "col2":["CO", "WA", "PA"]}
df1 = pd.DataFrame(df1)
df1['col3'] = np.nan
In[]df1
Out[]: 
     col1 col2  col3
0  aliceA   CO   NaN
1  aliceB   WA   NaN
2  aliceC   PA   NaN

df2 = {'col1': ["aliceB", "aliceA", "aliceC",  "bobC", "bobB", "bobA",], 'col2': ['Busy','Non-Busy','Busy','Non-Busy','Non-Busy','Busy']}
df2 = pd.DataFrame(df2)
In[]df2
Out[]: 
     col1      col2
0  aliceB      Busy
1  aliceA  Non-Busy
2  aliceC      Busy
3    bobC  Non-Busy
4    bobB  Non-Busy
5    bobA      Busy

***Preferred Output***
Out[]: 
     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy

對於此類問題,MATLAB會采用兩個矩陣,並使用嵌套的for循環進行迭代以找到值。 在Python中,我做了:

for i in range(0, df2.shape[0]):
        for j in range(0, df1.shape[0]):
            if(df2.col1[i] == df1.col1[j]):
                df1.col3[j] = df2.col2[i]   

但是我得到了這個警告,我必須使用Control + C退出警告才能繼續:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

df1
Out[]: 
     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy

從技術上講,此代碼有效,並且我的數據已填寫,但是我知道這可能是解決我的問題的糟糕方法。 對於這個小例子,它並沒有強迫我使用Control + C,但是當我的df1的行長為數千行時,它會強制執行。

簡單map

df1.col3=df1.col1.map(df2.set_index('col1').col2)
df1
Out[31]: 
     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy

使用merge

df1.merge(df2.rename(columns={'col2': 'col3'}), on='col1')

     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM