【发布时间】:2021-08-19 09:58:15
【问题描述】:
我正在寻找运行将两个数据帧作为参数 df1 和 df2 的函数的方法。
我想要的是根据 df2 中的信息在 df1 中创建一个新列,而不使用循环,因为我的整个 df1 是 3M 行,df2 是 700k 行。
为此,我比较 df1 的 X 的值是否包含在 from 和 df2 的 to 中
我尝试使用 pandas 库,但出现如下错误:
ValueError: 只能比较标签相同的 Series 对象
这是我的代码示例。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'X':[1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9,
2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9],
'Z':['F1','F2','F2','F1','F1','F2','F2','F1','F2','F2',
'F1','F1','F1','F1','F1','F1','F1','F1','F1','F1']})
df2 = pd.DataFrame({
'from': [1.0, 1.5, 1.8, 2.2, 2.6],
'to': [1.5, 1.8, 2.2, 2.6, 2.9],
'Z': ['F1', 'F1', 'F2', 'F1', 'F2'],
'Y': ['foo', 'bar', 'foobar', 'foo', 'zoo']
})
def asign(df1, df2):
if df1['Z'] == df2['Z']:
idx = np.where((df1[X] >= df2['from']) & (df1[X]<= df2['to']))[0]
df1['Y'] = df2['Y'][idx]
return df1
df1.groupby('Z').apply(asign, df2)
输出必须是这样的:
>>> df1
out[0] :
X Z Y
0 1.0 F1 foo
1 1.1 F2 bar
2 1.2 F2 foobar
3 1.3 F1 foo
4 1.4 F1 foobar
5 1.5 F2 bar
6 1.6 F1 foo
7 1.7 F2 bar
要在 df1 中创建的 Y 列的值取决于该行属于 F1 或 F2 组 Z 并且 X 的值大于或等于 from 且小于 to 请问你能帮我解决这个问题吗? 谢谢
【问题讨论】:
-
您能否编辑您的问题并将预期的输出(+解释)放在那里?
-
问题已更新