相关疑难解决方法(0)

合并pandas数据帧,其中一个值介于两个其他值之间

我需要在标识符和条件上合并两个pandas数据帧,其中一个数据帧中的日期在另一个数据帧中的两个日期之间.

Dataframe A有一个日期("fdate")和一个ID("cusip"):

在此输入图像描述

我需要将此与此数据帧B合并:

在此输入图像描述

A.cusip==B.ncusipA.fdate之间B.namedtB.nameenddt.

在SQL中这将是微不足道的,但我能看到如何在pandas中执行此操作的唯一方法是首先在标识符上无条件合并,然后在日期条件上进行过滤:

df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip')
df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]
Run Code Online (Sandbox Code Playgroud)

这真的是最好的方法吗?似乎如果可以在合并中进行过滤以避免在合并之后但在过滤器完成之前具有可能非常大的数据帧,则会好得多.

python timespan join date-range pandas

46
推荐指数
3
解决办法
2万
查看次数

在pandas中按范围加入/合并的最佳方式

我经常使用范围条件将pandas用于合并(join).

例如,如果有2个数据帧:

A(A_id,A_value)

B(B_id,B_low,B_high,B_name)

它们很大并且大小相同(比如每个2M记录).

我想在A和B之间建立一个内连接,所以A_value将在B_low和B_high之间.

使用SQL语法:

SELECT *
FROM A,B
WHERE A_value between B_low and B_high
Run Code Online (Sandbox Code Playgroud)

这将非常简单,简短而有效.

同时在pandas中唯一的方法(不使用我发现的循环)是在两个表中创建一个虚拟列,连接它(相当于交叉连接),然后过滤掉不需要的行.这听起来沉重而复杂:

A['dummy'] = 1
B['dummy'] = 1
Temp = pd.merge(A,B,on='dummy')
Result = Temp[Temp.A_value.between(Temp.B_low,Temp.B_high)]
Run Code Online (Sandbox Code Playgroud)

我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)]掩码在B上的每个A值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.

是否有更优雅和/或更有效的方式来执行此操作?

python join numpy pandas

20
推荐指数
2
解决办法
6707
查看次数

基于两个其他日期之间的日期合并两个数据帧而不使用公共列

我有两个数据帧,我需要根据日期值是否适合两个其他日期进行合并.基本上我需要执行外连接,其中B.event_date位于A.start_date和A.end_date之间.似乎合并和连接总是假设一个公共列,在这种情况下,我没有.

    A                           B
    start_date  end_date        event_date  price
0   2017-03-27  2017-04-20  0   2017-01-20  100
1   2017-01-10  2017-02-01  1   2017-01-27  200

Result 
    start_date  end_date        event_date  price
0   2017-03-27  2017-04-20  
1   2017-01-10  2017-02-01      2017-01-20  100
2   2017-01-10  2017-02-01      2017-01-27  200
Run Code Online (Sandbox Code Playgroud)

python pandas

16
推荐指数
1
解决办法
8770
查看次数

在pandas Intervalindex中查找匹配间隔

Intervalindex在0.20中有一个名为new 的有趣API ,它允许您创建间隔索引.

给出一些样本数据:

data = [(893.1516130000001, 903.9187099999999),
 (882.384516, 893.1516130000001),
 (817.781935, 828.549032)]
Run Code Online (Sandbox Code Playgroud)

您可以像这样创建索引:

idx = pd.IntervalIndex.from_tuples(data)

print(idx)
IntervalIndex([(893.151613, 903.91871], (882.384516, 893.151613], (817.781935, 828.549032]]
              closed='right',
              dtype='interval[float64]')
Run Code Online (Sandbox Code Playgroud)

Intervals的一个有趣的属性是你可以执行间隔检查in:

print(y[-1])
Interval(817.78193499999998, 828.54903200000001, closed='right')

print(820 in y[-1])
True

print(1000 in y[-1])
False
Run Code Online (Sandbox Code Playgroud)

我想知道如何将此操作应用于整个索引.例如,给定一些数字900,我如何检索此数字适合的区间的布尔掩码?

我能想到:

m = [900 in y for y in idx]
print(m)
[True, False, False]
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

python intervals pandas

12
推荐指数
2
解决办法
2541
查看次数

Pandas在`datetimeIndex`中合并`datetime`或`datetime`

目前我有两个代表excel电子表格的数据框.我希望加入日期相同的数据.这是一对多的连接,因为一张电子表格有一个日期,然后我需要添加具有相同日期的多行的数据

一个例子:

            A                  B
     date     data       date                 data
0    2015-0-1 ...     0  2015-0-1 to 2015-0-2 ...
1    2015-0-2 ...     1  2015-0-1 to 2015-0-2 ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,来自A的两行都将从B接收行0和1,因为它们在该范围内.

我试过用

df3 = pandas.merge(df2, df1, how='right', validate='1:m', left_on='Travel Date/Range', right_on='End')
Run Code Online (Sandbox Code Playgroud)

完成此操作但收到此错误.

Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    df3 = pandas.merge(df2, df1, how='right', validate='1:m', left_on='Travel Date/Range', right_on='End')
  File "C:\Users\M199449\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\reshape\merge.py", line 61, in merge
    validate=validate)
  File "C:\Users\M199449\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\reshape\merge.py", line 555, in __init__
    self._maybe_coerce_merge_keys()
  File "C:\Users\M199449\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\reshape\merge.py", line 990, in _maybe_coerce_merge_keys
    raise ValueError(msg)
ValueError: You …
Run Code Online (Sandbox Code Playgroud)

python pandas

7
推荐指数
1
解决办法
1890
查看次数

合并两个数据帧,其中一个数据帧包含间隔数据

作为输入,我有两个数据帧:

data1 = [{'code':100}, {'code':120}, {'code':110}]
data1 = pd.DataFrame(data1)

   code
 0   100
 1   120
 2   110

data2 = [{'category':1, 'l_bound':99, 'r_bound':105},{'category':2, 'l_bound':107, 'r_bound':110},{'category':3, 'l_bound':117, 'r_bound':135}]
data2 = pd.DataFrame(data2)

   category  l_bound  r_bound
0         1       99      105
1         2      107      110
2         3      117      135
Run Code Online (Sandbox Code Playgroud)

我想最终得到以下数据帧,如果代码位于相应的区间中,则第一个数据帧中的附加列作为类别编号:

    code   category
 0   100          1
 1   120          3
 2   110          2
Run Code Online (Sandbox Code Playgroud)

间隔是随机的,原始数据帧非常大.循环使用itertuples太慢了.任何pythonic解决方案?

python dataframe pandas

6
推荐指数
1
解决办法
324
查看次数

如何使用 groupby/cut 将 Pandas DataFrame 日期分组到自定义日期范围箱中

我正在尝试使用自定义范围对日期进行分组groupby,但cut到目前为止尚未成功。从返回的错误消息来看,我想知道 cut 是否正在尝试将我的日期处理为数字。

我想df1['date']按自定义日期范围进行分组,然后对df1['HDD']值求和。自定义范围位于df2

import pandas as pd
df1 = pd.DataFrame( {'date': ['2/1/2015', '3/2/2015', '3/3/2015', '3/4/2015','4/17/2015','5/12/2015'],
                             'HDD' : ['7.5','8','5','23','11','55']})
    HDD  date
0   7.5 2/1/2015
1   8   3/2/2015
2   5   3/3/2015
3   23  3/4/2015
4   11  4/17/2015
5   55  5/12/2015
Run Code Online (Sandbox Code Playgroud)

df2具有自定义日期范围:

df2 = pd.DataFrame( {'Period': ['One','Two','Three','Four'],
                     'Start Dates': ['1/1/2015','2/15/2015','3/14/2015','4/14/2015'],
                     'End Dates' : ['2/14/2015','3/13/2015','4/13/2015','5/10/2015']})

    Period  Start Dates End Dates
0   One     1/1/2015    2/14/2015
1   Two     2/15/2015   3/13/2015
2   Three   3/14/2015   4/13/2015 …
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

5
推荐指数
1
解决办法
3198
查看次数

如何对列值在一定范围内的两个数据框进行外部合并?

这是这个的后续问题

我有两个dataframes

print df_1

  timestamp      A          B
0 2016-05-15     0.020228   0.026572
1 2016-05-15     0.057780   0.175499
2 2016-05-15     0.098808   0.620986
3 2016-05-17     0.158789   1.014819
4 2016-05-17     0.038129   2.384590
5 2018-05-17     0.011111   9.999999


print df_2

  start                end  event    
0 2016-05-14   2016-05-16   E1
1 2016-05-14   2016-05-16   E2
2 2016-05-17   2016-05-18   E3
Run Code Online (Sandbox Code Playgroud)

如果落在和之间,我想合并df_1df_2并获取。event columndf_1timestampstartend

问题以及与这个问题的差异

1) eventsE1E2具有相同的startend

2) 同样在df_1 …

python python-3.x pandas

5
推荐指数
1
解决办法
90
查看次数

Pandas 在另一个表的范围内查找值

在下面的示例中,我尝试检查表 1中的“值”是否在表 2中“开始”和“停止”列的行中的值范围内。如果值在该范围内,我想返回“Fruit”类型。Between 方法似乎能够完成此任务,但不确定如何将其应用于另一个表中的行。注意我需要使用大型数据集来执行此任务,并且愿意使用 pandas 库之外的方法。

在此输入图像描述

示例代码

df1 = pd.DataFrame({'Date': {0: '06-01', 1: '06-02', 2: '06-03', 3: '06-04'},
                   'Value': {0: 3, 1: 7, 2: 9, 3: 16}, })

df2 = pd.DataFrame({'Start': {0: 1, 1: 6, 2: 11, 3: 16},
                    'Stop': {0: 5, 1: 10, 2: 15, 3: 20},
                    'Fruit': {0: 'Apple', 1: 'Orange', 2: 'Pear', 3: 'Mango'},})
Run Code Online (Sandbox Code Playgroud)

表格1

    Date  Value
0  06-01      3
1  06-02      7
2  06-03      9
3  06-04     16
Run Code Online (Sandbox Code Playgroud)

表2

    Fruit  Start  Stop
0 …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

5
推荐指数
1
解决办法
3022
查看次数

熊猫:根据时间间隔加入数据帧

我有一个数据框,每 10 分钟有一个日期时间列和一个数值:

df1 = pd.DataFrame({'time' : pd.date_range('1/1/2018', periods=20, freq='10min'), 'value' : np.random.randint(2, 20, size=20)})
Run Code Online (Sandbox Code Playgroud)

另一个有事件时间表,有开始时间和结束时间。可以同时发生多个事件:

df2 = pd.DataFrame({'start_time' : ['2018-01-01 00:00:00', '2018-01-01 00:00:00','2018-01-01 01:00:00', '2018-01-01 01:00:00', '2018-01-01 01:00:00', '2018-01-01 02:00:00' ], 'end_time' : ['2018-01-01 01:00:00', '2018-01-01 01:00:00', '2018-01-01 02:00:00','2018-01-01 02:00:00', '2018-01-01 02:00:00', '2018-01-01 03:00:00'], 'event' : ['A', 'B', 'C', 'D', 'E', 'F'] })
df2[['start_time', 'end_time']] = df2.iloc[:,0:2].apply(pd.to_datetime)
Run Code Online (Sandbox Code Playgroud)

我想对 df1 进行左连接,所有事件都在开始和结束时间内。我的输出表应该是:

                  time  value event
0  2018-01-01 00:00:00      5     A
1  2018-01-01 00:00:00      5     B
2  2018-01-01 00:10:00     15     A
3 …
Run Code Online (Sandbox Code Playgroud)

python datetime pandas

3
推荐指数
1
解决办法
1610
查看次数