根据两个熊猫数据框之间的条件将值分配给新列

时间:2019-12-16 20:05:56

标签: python pandas numpy dataframe

让我们说有两个数据帧: df1包含4列。 “名称”列包含城市名称(A,B,C)。其他各列均表示包含该城市人口的年份(y0,y1,y2)。

[
    {id: "BLR_123"},
    {id: "BLR_124"},
    {id: "BLR_125"},
    {id: "BLR_121"},
    {id: "BLR_122"},
    {id: "BLR_126"},
    {id: "BLR_127"},
    {id: "BLR_128"},
]

df2包含3列。 “名称”列包含城市名称。 “ y”列包含年份的值(y0,y1,y2),“ i”列包含可以访问互联网的人数。

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上创建一列,其中包含df1的值,条件是df2 ['NAME']的值等于df1 ['NAME']和df2 ['y']相等到df1列,以获得以下结果:

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

城市名称出现在df上的次数不是恒定的。 预先谢谢你。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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