根据两个Pandas数据框之间的条件,为新列分配值

3
假设有两个数据框: df1包含4列。'名称'列包含城市的名称(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['NAME']相等且df2['y']等于df1的列值的df1的值,以获得以下结果:


   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['y'] 应该等于哪一列? - Umar.H
1
它应该等于df1中的“年份”(y0、y1、y2之一)。 - Diogo Pessanha
2个回答

2

由于值匹配,您可以这样做:

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

或者使用combinefirst函数
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

0

我认为合并会更好。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接