给定两个dataframes df_1和df_2如何加入他们的行列,使得datetime列df_1是介于两者之间start,并end 在数据帧df_2:
print df_1
timestamp A B
0 2016-05-14 10:54:33 0.020228 0.026572
1 2016-05-14 10:54:34 0.057780 0.175499
2 2016-05-14 10:54:35 0.098808 0.620986
3 2016-05-14 10:54:36 0.158789 1.014819
4 2016-05-14 10:54:39 0.038129 2.384590
print df_2
start end event
0 2016-05-14 10:54:31 2016-05-14 10:54:33 E1
1 2016-05-14 10:54:34 2016-05-14 10:54:37 E2
2 2016-05-14 10:54:38 2016-05-14 10:54:42 E3
Run Code Online (Sandbox Code Playgroud)
获取相应的event位置和df1.timestamp之间df_2.startdf2.end
timestamp A B event
0 2016-05-14 10:54:33 …Run Code Online (Sandbox Code Playgroud) 我需要在标识符和条件上合并两个pandas数据帧,其中一个数据帧中的日期在另一个数据帧中的两个日期之间.
Dataframe A有一个日期("fdate")和一个ID("cusip"):

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

在A.cusip==B.ncusip和A.fdate之间B.namedt和B.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)
这真的是最好的方法吗?似乎如果可以在合并中进行过滤以避免在合并之后但在过滤器完成之前具有可能非常大的数据帧,则会好得多.
我有两个数据帧,我需要根据日期值是否适合两个其他日期进行合并.基本上我需要执行外连接,其中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) 标题有点令人困惑,但我会尽力在这里解释我的问题.我有2个pandas数据帧,a和b:
>> print a
id | value
1 | 250
2 | 150
3 | 350
4 | 550
5 | 450
>> print b
low | high | class
100 | 200 | 'A'
200 | 300 | 'B'
300 | 500 | 'A'
500 | 600 | 'C'
Run Code Online (Sandbox Code Playgroud)
我想在表a中创建一个名为class的新列,该列包含符合表b的值的类.这是我想要的结果:
>> print a
id | value | class
1 | 250 | 'B'
2 | 150 | 'A'
3 | 350 | 'A'
4 | 550 | …Run Code Online (Sandbox Code Playgroud) 目前我有两个代表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 的in操作符似乎是可能的(这x in range(y, z)是很常见的),但会涉及一个讨厌的 for 循环和 if/else 块。一定有更好的方法。
这是我的数据的一个简单版本:
# These are in any order
sample = pd.DataFrame({
'col1': ['1b', '1a', '1a', '1b'],
'col2': ['2b', '2b', '2a', '2a'],
'col3': [42, 3, 21, 7]
})
# The 'look-up' table
look_up = pd.DataFrame({
'col1': ['1a', '1a', '1a', '1a', '1b', '1b', '1b', '1b'],
'col2': ['2a', '2a', '2b', '2b', '2a', '2a', '2b', '2b'],
'col3': [range(0,10), range(10,101), range(0,10), range(10,101), range(0,10), range(10,101), range(0,10), range(10,101)],
'col4': ['a', 'b', …Run Code Online (Sandbox Code Playgroud) 给出两个数据帧如下:
>>> import pandas as pd
>>> df_a = pd.DataFrame([{"a": 1, "b": 4}, {"a": 2, "b": 5}, {"a": 3, "b": 6}])
>>> df_b = pd.DataFrame([{"c": 2, "d": 7}, {"c": 3, "d": 8}])
>>> df_a
a b
0 1 4
1 2 5
2 3 6
>>> df_b
c d
0 2 7
1 3 8
Run Code Online (Sandbox Code Playgroud)
我们希望使用非简单的标准生成两种数据帧的SQL样式连接,比如说"df_b.c> df_a.a".从我所知,虽然merge()肯定是解决方案的一部分,但我不能直接使用它,因为它不接受"ON"标准的任意表达式(除非我遗漏了什么?).
在SQL中,结果如下所示:
# inner join
sqlite> select * from df_a join df_b on c > a;
1|4|2|7
1|4|3|8
2|5|3|8
# outer join …Run Code Online (Sandbox Code Playgroud) 我有一个下面的数据框。
df = pd.DataFrame(columns=['Chromosome', 'Start','End'],
data=[
['chr1', 2000, 3000],
['chr1', 500, 1500],
['chr3', 3000, 4000],
['chr5', 4000, 5000],
['chr17', 9000, 10000],
['chr19', 1500, 2500]
])
Run Code Online (Sandbox Code Playgroud)
我有一个探针数据框,如下所示。
probes = pd.DataFrame(columns=['Probe', 'Chrom','Position'],
data=[
['CG999', 'chr1', 2500],
['CG000', 'chr19, 2000],
])
Run Code Online (Sandbox Code Playgroud)
我想过滤 df 以查找包含探针染色体并且探针位置在其开始和结束编号之间的行,然后将探针名称添加到 df 中的新列/字段。所需的输出如下:
Probe Chrom Start End
0 CG999 chr1 2000 3000
5 CG000 chr19 1500 2500
Run Code Online (Sandbox Code Playgroud)
我在下面的尝试有效,但没有将探针名称放入探针列中,并且依赖于循环探针数据。必须有一种更有效的方法来做到这一点。
all_indexes = []
# fake2.tsv is the aforementioned probes dataframe
with open('fake2.tsv') as f:
for x in f:
probe, chrom, pos = …Run Code Online (Sandbox Code Playgroud)