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周,这肯定会起作用,但您认为这可以通过例如有条件匹配日期来实现吗