简体   繁体   中英

Assign values to columns in Pandas Dataframe based on data from another dataframe

I have two dataframes containing concentration data and coordinates:

Concentration Data (conc):

    Sample  analParam                 Conc  Units
0   CW7-1   1,1,1-Trichloroethane     0     UG/L
1   CW7-1   1,1,2,2-Tetrachloroethane 0     UG/L
2   CW7-1   1,1,2-Trichloroethane     0     UG/L
3   CW7-1   1,1-Dichloroethane        0     UG/L
4   CW7-1   1,1-Dichloroethylene      0     UG/L
5   CW7-1   1,1-Dichloropropene       0     UG/L
6   CW7-1   1,2,3-Trichlorobenzene    0     UG/L
... ... ... ... ...
50311   VOA2-2  Tetrachloroethylene  1.8    MG/KG
50312   VOA2-2  Toluene              1.2    MG/KG
50313   VOA2-2  Trichloroethylene    1.8    MG/KG
50314   VOA2-2  Vinyl Chloride       1.8    MG/KG

Coordinate Data (coord):

    Sample  x            y
0   CW7-1   320800.000  396500.000
1   CW7-2   320800.000  396500.000
2   CW7-3   320800.000  396500.000
3   FB06-17 0.000       0.000
4   FB06-18 0.000       0.000
5   FB06-19 0.000       0.000
6   FB07-08 0.000       0.000
... ... ... ...
453 TP21-1  318807.281  398547.485
454 TP21-2  318807.281  398547.485
455 TP24-1  318489.248  398544.797
456 VOA1-1  318500.582  398573.558
457 VOA1-2  318500.582  398573.558
458 VOA2-1  318536.337  398589.805
459 VOA2-2  318536.337  398589.805

I want to add two columns to my concentration dataframe that contains all the coordinates of the respective sample IDs for each concentration. For example, the first six rows in the Concentration Data would have columns of x = 320800 and y = 396500 since they all have Sample IDs of CW7-1:

    Sample  analParam                 Conc  Units   x       y
0   CW7-1   1,1,1-Trichloroethane     0     UG/L    320800  396500   
1   CW7-1   1,1,2,2-Tetrachloroethane 0     UG/L    320800  396500
2   CW7-1   1,1,2-Trichloroethane     0     UG/L    320800  396500  
3   CW7-1   1,1-Dichloroethane        0     UG/L    320800  396500  
4   CW7-1   1,1-Dichloroethylene      0     UG/L    320800  396500  
5   CW7-1   1,1-Dichloropropene       0     UG/L    320800  396500

I've tried using double for loops, but it takes way too slow since I have so many data points:

for index, row in conc.iterrows():
    for cindex, crow in coord.iterrows():
        if conc.iloc[index,0] == coord.iloc[cindex,0]:
            conc.at[index,4] = coord.iloc[cindex,1]
            conc.at[index,5] = coord.iloc[cindex,2]

I've tried using the apply function, but I keep getting errors. For this rendition, I got TypeError: call () takes from 1 to 2 positional arguments but 3 were given.

def xcoord (i):
    for index, row in coord.iterrows():
        if i == coord.iloc[index,0] :
            return coord.iloc(index,4)
conc['Sample'].apply(xcoord)

Thanks Wen!

In[1]:
conc.merge(coord,on='Sample',how='left')

Out[1]:
Sample  analParam   Conc    Units   x   y
0   CW7-1   1,1,1-Trichloroethane   0   UG/L    320800.000  396500.000
1   CW7-1   1,1,2,2-Tetrachloroethane   0   UG/L    320800.000  396500.000
2   CW7-1   1,1,2-Trichloroethane   0   UG/L    320800.000  396500.000
3   CW7-1   1,1-Dichloroethane  0   UG/L    320800.000  396500.000
4   CW7-1   1,1-Dichloroethylene    0   UG/L    320800.000  396500.000
5   CW7-1   1,1-Dichloropropene 0   UG/L    320800.000  396500.000
6   CW7-1   1,2,3-Trichlorobenzene  0   UG/L    320800.000  396500.000
... ... ... ... ... ... ...
50311   VOA2-2  Tetrachloroethylene 1.8 MG/KG   318536.337  398589.805
50312   VOA2-2  Toluene 1.2 MG/KG   318536.337  398589.805
50313   VOA2-2  trans-1,3-Dichloropropene   1.8 MG/KG   318536.337  398589.805
50314   VOA2-2  Trichloroethylene   1.8 MG/KG   318536.337  398589.805
50315   VOA2-2  Vinyl Chloride  1.8 MG/KG   318536.337  398589.805
50316   VOA2-2  Xylenes (Total) 2.6 MG/KG   318536.337  398589.805

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM