簡體   English   中英

根據兩個 Pandas DataFrames 之間的條件為新列賦值

[英]Assign values to new column based on conditions between two pandas DataFrames

假設有兩個數據框:df1 包含 4 列。 'NAME' 列包含城市的名稱(A、B、C)。 其他每一列代表一個年份 (y0, y1, y2),其中包含居住在該城市的人數。

np.random.seed(seed=34)
name = ['A','B','C']
y0 = np.random.random_integers(1,high=40, size=3)
y1 = np.random.random_integers(1,high=40, size=3)
y2 = np.random.random_integers(1,high=40, size=3)
df = pd.DataFrame(data={'NAME' : name, 'y0' : y0, 'y1' : y1, 'y2' : y2})
df

   NAME y0  y1  y2
0   A   34  36  15
1   B   22  6   30
2   C   5   12  19

df2 包含 3 列。 'NAME' 列包含城市的名稱。 “y”列包含年份的值(y0、y1、y2),“i”列包含可以訪問互聯網的人數。

y = ['y0', 'y1', 'y2',  'y0', 'y1', 'y2',  'y0', 'y1', 'y2']
name2 = ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C']
i = [15, 6, 12, 18, 4, 20, 3, 8, 2]
df2 = pd.DataFrame(data={'NAME':name2, 'y':y, 'i':i})
df2

   NAME y   i
0   A   y0  15
1   A   y1  6
2   A   y2  23
3   B   y0  18
4   B   y1  17
5   B   y2  20
6   C   y0  3
7   C   y1  24
8   C   y2  2

我需要在 df2 上創建一個列,其中包含 df1 的值,條件是 df2['NAME'] 的值等於 df1['NAME'] 並且 df2['y'] 等於 df1 column ,以獲得以下結果:


   NAME y   i   v
0   A   y0  15  34
1   A   y1  6   36
2   A   y2  12  15
3   B   y0  18  22
4   B   y1  4   6
5   B   y2  20  30
6   C   y0  3   5
7   C   y1  8   12
8   C   y2  2   19

城市名稱出現在 df 上的次數不是常數。 先感謝您。

您可以這樣做,因為值匹配:

df2['v'] = df.melt(col_level=0, id_vars='NAME').sort_values(by='NAME').reset_index(drop=True)['value'] 

輸出:

  NAME   y   i   v
0    A  y0  15  34
1    A  y1   6  36
2    A  y2  12  15
3    B  y0  18  22
4    B  y1   4   6
5    B  y2  20  30
6    C  y0   3   5
7    C  y1   8  12
8    C  y2   2  19

或結合先

df3 = df.melt(col_level=0, id_vars='NAME').sort_values(by='NAME').reset_index(drop=True)  
df3 = df3.rename(columns={'variable':'y'})                                                                                         
df3 = df2.combine_first(df3)
df3['value'] = df3['value'].astype(int)


  NAME   i  value   y
0    A  15     34  y0
1    A   6     36  y1
2    A  12     15  y2
3    B  18     22  y0
4    B   4      6  y1
5    B  20     30  y2
6    C   3      5  y0
7    C   8     12  y1
8    C   2     19  y2

合並會更好imo,

df = pd.melt(df,id_vars='NAME',var_name='y',value_name='v')

df_new = pd.merge(df,df2,on=['NAME','y'].sort_values('NAME')
print(df_new)
  NAME   y   i   v
0    A  y0  15  34
3    A  y1   6  36
6    A  y2  12  15
1    B  y0  18  22
4    B  y1   4   6
7    B  y2  20  30
2    C  y0   3   5
5    C  y1   8  12
8    C  y2   2  19

暫無
暫無

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

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