从值表中为观察值分配值

时间:2015-07-10 12:40:17

标签: python pandas

我有大量的观察数据框。即。

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

我现在有一个值为

的外部DataFrame
_  ,a,b
1  ,10,20
2  ,30,40
3  ,50,60

将索引表中的值添加到第一个DataFrame的有效方法是什么?即:

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

2 个答案:

答案 0 :(得分:4)

使用SELECT CAST(LEFT(REPLACE('2015-06-13T21:49:13.395-07:00','T',' '),23) AS DATETIME) 的替代解决方案。它只是一行矢量化解决方案。适用于大型数据集。

.lookup()

答案 1 :(得分:1)

假设您的第一个和第二个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 Li的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