2014-02-05 41 views
1

我有两个数据帧。熊猫比较并从另一个数据帧中选择最小的数字

df1 
Out[162]: 
    a b c 
0 0 0 0 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
5 5 5 5 
6 6 6 6 
7 7 7 7 
8 8 8 8 
9 9 9 9 
10 10 10 10 
11 11 11 11 

df2 
Out[194]: 
    A B 
0 a 3 
1 b 4 
2 c 5 

我希望在DF2映射DF2 [“A”]到DF1并找到DF1最小的数字,这比在DF2 [“B”]的数量更大,以创建第三列。例如,对于df2 ['C']。ix [0],它应该转到df1 ['a']并搜索大于df2 ['B']。ix [0]的最小数字,这应该是4.

我有类似df2['C'] = df2['A'].map(df1[df1 > df2['B']].min())。但这不起作用,因为它不会去df2 ['B']搜索相应的行。谢谢。

回答

2

使用apply进行行方法:

In [54]: 
# create our data 
import pandas as pd 

df1 = pd.DataFrame({'a':list(range(12)), 'b':list(range(12)), 'c':list(range(12))}) 
df1 
Out[54]: 
    a b c 
0 0 0 0 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
5 5 5 5 
6 6 6 6 
7 7 7 7 
8 8 8 8 
9 9 9 9 
10 10 10 10 
11 11 11 11 

[12 rows x 3 columns] 

In [68]: 
# create our 2nd dataframe, note I have deliberately used alternate values for column 'B' 
df2 = pd.DataFrame({'A':list('abc'), 'B':[3,5,7]}) 
df2 
Out[68]: 
    A B 
0 a 3 
1 b 5 
2 c 7 

[3 rows x 2 columns] 
In [69]: 

# apply row-wise function, must use axis=1 for row-wise 
df2['C'] = df2.apply(lambda row: df1[row['A']].ix[df1[row.A] > row.B].min(), axis=1) 
df2 
Out[69]: 
    A B C 
0 a 3 4 
1 b 5 6 
2 c 7 8 

[3 rows x 3 columns] 

有一个在大熊猫docs

+0

这是美丽的一些用法示例。感谢你及时的答复。 – KLI

相关问题