Python 3.x 查找数据帧比较不同大小的数据帧

Python 3.x 查找数据帧比较不同大小的数据帧,python-3.x,pandas,Python 3.x,Pandas,我有两只像这样的熊猫 df1 Amount Price 0 5 50 1 10 53 2 15 55 3 30 50 4 45 61 df2 Used amount 0 4.5 1 1.2 2 6.2 3 4.1 4 25.6 5 31 6 19 7 15 df3 Used

我有两只像这样的熊猫

df1
   Amount   Price
0    5       50
1    10      53 
2    15      55
3    30      50
4    45      61

df2 
     Used amount
 0      4.5
 1      1.2
 2      6.2
 3      4.1 
 4      25.6
 5      31
 6      19
 7      15  
df3 
     Used amount price
 0      4.5       50
 1      1.2       50
 2      6.2       53
 3      4.1       50
 4      25.6      50
 5      31        61
 6      19        50
 7      15        55
我试图在df2上插入一个新列,提供df1的价格,df1和df2的大小不同,df1更小

我期待着这样的事情

df1
   Amount   Price
0    5       50
1    10      53 
2    15      55
3    30      50
4    45      61

df2 
     Used amount
 0      4.5
 1      1.2
 2      6.2
 3      4.1 
 4      25.6
 5      31
 6      19
 7      15  
df3 
     Used amount price
 0      4.5       50
 1      1.2       50
 2      6.2       53
 3      4.1       50
 4      25.6      50
 5      31        61
 6      19        50
 7      15        55
我想用这个函数来解决这个问题

def price_function(key, table):
    used_amount_df2 = (row[0] for row in df1)
    price = filter(lambda x: x < key, used_amount_df1)
def price_函数(键,表):
已用金额(df2=(df1中的行为第[0]行)
价格=过滤器(λx:x<键,使用量\u df1)
您可以使用或
searchsorted
创建垃圾箱

注意:
df1
中的索引必须是默认值-
0,1,2…

#create default index if necessary
df1 = df1.reset_index(drop=True)

#create bins
bins = [0] + df1['Amount'].tolist()
#get index values of df1 by values of Used amount
a = pd.cut(df2['Used amount'], bins=bins, labels=df1.index)
#assign output
df2['price'] = df1['Price'].values[a]
print (df2)
   Used amount  price
0          4.5     50
1          1.2     50
2          6.2     53
3          4.1     50
4         25.6     50
5         31.0     61
6         19.0     50
7         15.0     55


使用
pd.IntervalIndex
可以

In [468]: df1.index = pd.IntervalIndex.from_arrays(df1.Amount.shift().fillna(0),df1.Amount)

In [469]: df1
Out[469]:
              Amount  Price
(0.0, 5.0]         5     50
(5.0, 10.0]       10     53
(10.0, 15.0]      15     55
(15.0, 30.0]      30     50
(30.0, 45.0]      45     61

In [470]: df2['price'] = df2['Used amount'].map(df1.Price)

In [471]: df2
Out[471]:
   Used amount  price
0          4.5     50
1          1.2     50
2          6.2     53
3          4.1     50
4         25.6     50
5         31.0     61
6         19.0     50
7         15.0     55

您可以使用
pd.DataFrame.reindex
method=bfill

df1.set_index('Amount').reindex(df2['Used amount'], method='bfill')

             Price
Used amount       
4.5             50
1.2             50
6.2             53
4.1             50
25.6            50
31.0            61
19.0            50
15.0            55

要将其添加到新列中,我们可以使用

加入

df2.join(
    df1.set_index('Amount').reindex(df2['Used amount'], method='bfill'),
    on='Used amount'
)

   Used amount  Price
0          4.5     50
1          1.2     50
2          6.2     53
3          4.1     50
4         25.6     50
5         31.0     61
6         19.0     50
7         15.0     55
分配

df2.assign(
    Price=df1.set_index('Amount').reindex(df2['Used amount'], method='bfill').values)

   Used amount  Price
0          4.5     50
1          1.2     50
2          6.2     53
3          4.1     50
4         25.6     50
5         31.0     61
6         19.0     50
7         15.0     55

这是我自己的解决办法

第一种方法:

from itertools import product
import pandas as pd
df2=df2.reset_index()
DF=pd.DataFrame(list(product(df2.Usedamount, df1.Amount)), columns=['l1', 'l2'])
DF['DIFF']=(DF.l1-DF.l2)
DF=DF.loc[DF.DIFF<=0,]
DF=DF.sort_values(['l1','DIFF'],ascending=[True,False]).drop_duplicates(['l1'],keep='first')
df1.merge(DF,left_on='Amount',right_on='l2',how='left').merge(df2,left_on='l1',right_on='Usedamount',how='right').loc[:,['index','Usedamount','Price']].set_index('index').sort_index()


Out[185]: 
       Usedamount  Price
index                   
0             4.5     50
1             1.2     50
2             6.2     53
3             4.1     50
4            25.6     50
5            31.0     61
6            19.0     50
7            15.0     55

这也是我想到的第一件事。@piRSquared只想分享
pd.merge_asof
:)@Wen当然可以。我已经有一段时间没用了one@rriveral很高兴能帮上忙~非常感谢!我尝试使用我的数据集及其工作方式,但是,示例中的数据集df2使用量是一个月的数据,df1数据是一周的数据,因此我每x 1 df2有4 x df1,我已经检查了pd.merge_asof,但我认为它没有这样的and选项,您是否建议每周对数据集进行一次迭代,或者你认为df有一个合并的迭代_asof@rriveral对不起,我没有得到它,基本上你是做金额合并,对吗?因此,您需要逐月合并它,并
pd.concat
为误解感到抱歉,基本上我正在尝试做的,以及合并asof正在做的,是将使用的金额=4.5匹配到一个介于0到5之间的值,然后分配一个价格,因此使用的金额是一个巨大的一个月列表,但是,合并后的分配价格会在整个月内合并,但价格仅为该月内的一周,因此您所说的有意义,如果一个concat周,这肯定会起作用,但您认为这可以通过例如有条件匹配日期来实现吗