我有大量的观察数据框。即。
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
答案 0 :(得分:4)
使用SELECT CAST(LEFT(REPLACE('2015-06-13T21:49:13.395-07:00','T',' '),23) AS DATETIME)
的替代解决方案。它只是一行矢量化解决方案。适用于大型数据集。
.lookup()
答案 1 :(得分:1)
假设您的第一个和第二个dfs分别是df
和df1
,您可以合并匹配的列,然后屏蔽'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