从值表中为观察值赋值

从值表中为观察值赋值

问题描述:

我有大量的观测值DataFrame。即从值表中为观察值赋值

value 1,value 2 
a,1 
a,1 
a,2 
b,3 
a,3 

我现在值

_ ,a,b 
1 ,10,20 
2 ,30,40 
3 ,50,60 

什么将是一个有效的方式的外部数据帧从索引表添加到数据框第一的价值观?即:

value 1,value 2, new value 
a,1,10 
a,1,10 
a,2,30 
b,3,60 
a,3,50 
+0

DF代表什么? –

+0

DF代表DataFrame – DeanLa

另一种解决方案使用.lookup()。这只是一条线,矢量化的解决方案。适合大型数据集。

import pandas as pd 
import numpy as np 

# generate some artificial data 
# ================================ 
np.random.seed(0) 
df1 = pd.DataFrame(dict(value1=np.random.choice('a b'.split(), 10), value2=np.random.randint(1, 10, 10))) 

df2 = pd.DataFrame(dict(a=np.random.randn(10), b=np.random.randn(10)), columns=['a', 'b'], index=np.arange(1, 11)) 

df1 

Out[178]: 
    value1 value2 
0  a  6 
1  b  3 
2  b  5 
3  a  8 
4  b  7 
5  b  9 
6  b  9 
7  b  2 
8  b  7 
9  b  8 


df2 

Out[179]: 
     a  b 
1 2.5452 0.0334 
2 1.0808 0.6806 
3 0.4843 -1.5635 
4 0.5791 -0.5667 
5 -0.1816 -0.2421 
6 1.4102 1.5144 
7 -0.3745 -0.3331 
8 0.2752 0.0474 
9 -0.9608 1.4627 
10 0.3769 1.5350 



# processing: one liner lookup function 
# ======================================================= 
# df1.value2 is the index and df1.value1 is the column 
df1['new_values'] = df2.lookup(df1.value2, df1.value1) 

Out[181]: 
    value1 value2 new_values 
0  a  6  1.4102 
1  b  3  -1.5635 
2  b  5  -0.2421 
3  a  8  0.2752 
4  b  7  -0.3331 
5  b  9  1.4627 
6  b  9  1.4627 
7  b  2  0.6806 
8  b  7  -0.3331 
9  b  8  0.0474 
+0

当索引为0时,您不需要将索引值偏移1吗? – EdChum

+0

@EdChum这绝对是一个有效的点,并且在构建数据“df2”时已经完成。因为我们只是使用列值,因此'df1'中的索引无关紧要。 –

+0

目前还不清楚''_''是一个实际的列还是来自OP的样本dfs的索引,但是'lookup'是更好的方法+1 – EdChum

假设你的第一和第二DFS分别为dfdf1,您可以合并的匹配列,然后掩盖的“a”和“b”条件:

In [9]: 
df = df.merge(df1, left_on=['value 2'], right_on=['_']) 
a_mask = (df['value 2'] == df['_']) & (df['value 1'] == 'a') 
b_mask = (df['value 2'] == df['_']) & (df['value 1'] == 'b') 
df.loc[a_mask, 'new value'] = df['a'].where(a_mask) 
df.loc[b_mask, 'new value'] = df['b'].where(b_mask) 
df 

Out[9]: 
    value 1 value 2 _ a b new value 
0  a  1 1 10 20   10 
1  a  1 1 10 20   10 
2  a  2 2 30 40   30 
3  b  3 3 50 60   60 
4  a  3 3 50 60   50 

可以然后删除附加列:

In [11]: 
df = df.drop(['_','a','b'], axis=1) 
df 

Out[11]: 
    value 1 value 2 new value 
0  a  1   10 
1  a  1   10 
2  a  2   30 
3  b  3   60 
4  a  3   50 

的另一种方式是定义一个FUNC执行查阅:

In [15]: 
def func(x): 
    row = df1[(df1['_'] == x['value 2'])] 
    return row[x['value 1']].values[0] 

df['new value'] = df.apply(lambda x: func(x), axis = 1) 
df 

Out[15]: 
    value 1 value 2 new value 
0  a  1   10 
1  a  1   10 
2  a  2   30 
3  b  3   60 
4  a  3   50 

编辑

使用@Jianxun李的lookup的作品,但你必须以抵消指数作为指数是基于0

In [20]: 
df['new value'] = df1.lookup(df['value 2'] - 1, df['value 1']) 
df 

Out[20]: 
    value 1 value 2 new value 
0  a  1   10 
1  a  1   10 
2  a  2   30 
3  b  3   60 
4  a  3   50