dli*_*say 7 merge range python-3.x pandas
我的问题是一个扩展这一个几年前提出。
我正在尝试左连接,但我想加入的列之一需要是一个范围值。它需要是一个范围,因为扩展它意味着数百万个新的(和不必要的)行。直觉上,使用 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', 'c', 'd', 'e', 'f', 'g', 'h']
})
Run Code Online (Sandbox Code Playgroud)
我最初尝试合并以查看 Pandas 是否会理解,但存在类型不匹配错误。
sample.merge(
look_up,
how='left',
left_on=['col1', 'col2', 'col3'],
right_on=['col1', 'col2', 'col3']
)
# ValueError: You are trying to merge on int64 and object columns. If you wish to proceed you should use pd.concat
Run Code Online (Sandbox Code Playgroud)
查看文档pd.concat似乎也不会给我想要的结果。而不是追加,我仍然试图得到像merge. 我试图按照我在开始时链接的问题给出的答案进行操作,但这也不起作用。我完全有可能误解了如何使用,np.where但我也希望有一个解决方案不那么笨拙。
这是我尝试使用np.where:
s1 = sample['col1'].values
s2 = sample['col2'].values
s3 = sample['col3'].values
l1 = look_up['col1'].values
l2 = look_up['col2'].values
l3 = look_up['col3'].values
i, j = np.where((s3[:, None] in l3) & (s2[:, None] == l2) & (s1[:, None] == l1))
result = pd.DataFrame(
np.column_stack([sample.values[i], look_up.values[j]]),
columns=sample.columns.append(look_up.columns)
)
len(result) # returns 0
Run Code Online (Sandbox Code Playgroud)
我想要的结果应该是这样的:
col1 col2 col3 col4
'1b' '2b' 42 'h'
'1a' '2b' 3 'c'
'1a' '2a' 21 'b'
'1b' '2a' 7 'e'
Run Code Online (Sandbox Code Playgroud)
由于范围看起来相当大,并且您正在使用整数值,因此您可以只计算最小值、最大值:
columns = look_up.columns
look_up['minval'] = look_up['col3'].apply(min)
look_up['maxval'] = look_up['col3'].apply(max)
(sample.merge(look_up, on=['col1','col2'], how='left',
suffixes=['','_'])
.query('minval <= col3 <= maxval')
[columns]
)
Run Code Online (Sandbox Code Playgroud)
输出:
col1 col2 col3 col4
1 1b 2b 42 h
2 1a 2b 3 c
5 1a 2a 21 b
6 1b 2a 7 e
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |