根据复杂条件将列添加到 pdf.df

斯特夫

我有两个 df 看起来像这样:

In [500]: df1.iloc[67:100]
Out[500]: 
        Expiry       K Type     close
107 2018-01-26  123.00    C  0.406250
108 2018-01-26  124.00    C  0.062500
109 2018-01-26  125.00    C  0.015625
112 2018-01-26  121.50    C  1.640625
121 2018-02-23  123.50    C  0.406250
124 2018-02-23  127.50    C  0.015625
127 2018-02-23  124.50    C  0.140625
130 2018-02-23  125.50    C  0.046875
144 2018-05-25  120.00    C  3.156250
145 2018-05-25  121.00    C  2.203125
146 2018-05-25  122.00    C  1.328125
147 2018-02-23  123.00    C  0.640625
148 2018-02-23  124.00    C  0.234375
152 2018-02-23  121.50    C  1.750000
156 2018-02-23  126.50    C  0.015625
158 2018-02-23  122.50    C  0.953125
160 2018-03-23  123.25    P  0.484375
161 2018-03-23  123.50    P  0.625000
162 2018-03-23  123.75    P  0.796875
163 2018-03-23  127.25    P  4.125000
164 2018-03-23  127.50    P  4.375000

In [501]: df2
Out[501]: 
                              F       Symbol
Expiry                                      
2018-03-20 12:00:00  123.125000  ZN   MAR 18
2018-06-20 12:00:00  122.734375  ZN   JUN 18
2018-09-19 12:00:00  122.265625  ZN   SEP 18

我希望根据以下函数将带有“F”(来自 df2)的列添加到 df1:

from pandas.tseries.offsets import MonthEnd
def find_F(df1_expiry):
    F = df2.loc[(df2.index > df1_expiry + MonthEnd(1)) &
             (df2.index < df1_expiry + MonthEnd(4))].F
    return F

应用可以解决问题:

df['F'] = df1['Expiry'].apply(find_F)

只是不确定这是最好的方法。

预期输出:

        Expiry       K Type     close  F
107 2018-01-26  123.00    C  0.406250  123.125000 
108 2018-01-26  124.00    C  0.062500  123.125000 
109 2018-01-26  125.00    C  0.015625  123.125000 
112 2018-01-26  121.50    C  1.640625  123.125000 
121 2018-02-23  123.50    C  0.406250  123.125000 
124 2018-02-23  127.50    C  0.015625  123.125000 
127 2018-02-23  124.50    C  0.140625  123.125000 
130 2018-02-23  125.50    C  0.046875  123.125000 
144 2018-05-25  120.00    C  3.156250  122.734375
145 2018-05-25  121.00    C  2.203125  122.734375
146 2018-05-25  122.00    C  1.328125  122.734375
147 2018-02-23  123.00    C  0.640625  122.734375
148 2018-02-23  124.00    C  0.234375  122.734375
152 2018-06-22  121.50    C  1.750000  122.265625
156 2018-06-22  126.50    C  0.015625  122.265625
158 2018-02-23  122.50    C  0.953125  122.734375
160 2018-03-23  123.25    P  0.484375  122.734375
161 2018-03-23  123.50    P  0.625000  122.734375
162 2018-03-23  123.75    P  0.796875  122.734375
163 2018-03-23  127.25    P  4.125000  122.734375
164 2018-03-23  127.50    P  4.375000  122.734375

我正在寻找最有效的方法。感谢任何建议。

耶斯列

如果输入 2 DataFrames 第一步是创建一个(例如通过交叉连接)然后过滤:

df = pd.merge(df1.assign(A=1), df2.reset_index().assign(A=1)[['A','Expiry','F']], on='A')
mask = (df['Expiry_y'] > df['Expiry_x'] + pd.offsets.DateOffset(day=1, months=1)) & \
       (df['Expiry_y'] < df['Expiry_x'] + pd.offsets.DateOffset(day=31,months=6))

df = df[mask]
print (df.head())
    Expiry_x      K Type     close  A            Expiry_y           F
0 2018-01-26  123.0    C  0.406250  1 2018-03-20 12:00:00  123.125000
1 2018-01-26  123.0    C  0.406250  1 2018-06-20 12:00:00  122.734375
3 2018-01-26  124.0    C  0.062500  1 2018-03-20 12:00:00  123.125000
4 2018-01-26  124.0    C  0.062500  1 2018-06-20 12:00:00  122.734375
6 2018-01-26  125.0    C  0.015625  1 2018-03-20 12:00:00  123.125000

编辑:

您可以使用:

from pandas.tseries.offsets import MonthEnd
def find_F(df1):
    F = df2.loc[(df2.index > df1 + MonthEnd(1)) &
             (df2.index < df1 + MonthEnd(4)), 'F']
    return F.values[0]

df1['F'] = df1['Expiry'].apply(find_F)
print (df1)
        Expiry       K Type     close           F
107 2018-01-26  123.00    C  0.406250  123.125000
108 2018-01-26  124.00    C  0.062500  123.125000
109 2018-01-26  125.00    C  0.015625  123.125000
112 2018-01-26  121.50    C  1.640625  123.125000
121 2018-02-23  123.50    C  0.406250  123.125000
124 2018-02-23  127.50    C  0.015625  123.125000
127 2018-02-23  124.50    C  0.140625  123.125000
130 2018-02-23  125.50    C  0.046875  123.125000
144 2018-05-25  120.00    C  3.156250  122.734375
145 2018-05-25  121.00    C  2.203125  122.734375
146 2018-05-25  122.00    C  1.328125  122.734375
147 2018-02-23  123.00    C  0.640625  123.125000
148 2018-02-23  124.00    C  0.234375  123.125000
152 2018-02-23  121.50    C  1.750000  123.125000
156 2018-02-23  126.50    C  0.015625  123.125000
158 2018-02-23  122.50    C  0.953125  123.125000
160 2018-03-23  123.25    P  0.484375  122.734375
161 2018-03-23  123.50    P  0.625000  122.734375
162 2018-03-23  123.75    P  0.796875  122.734375
163 2018-03-23  127.25    P  4.125000  122.734375
164 2018-03-23  127.50    P  4.375000  122.734375

或者:

df = pd.merge(df1.assign(A=1), 
              df2.reset_index().assign(A=1)[['A','Expiry','F']], on='A')
mask = (df['Expiry_y'] > df['Expiry_x'] + MonthEnd(1)) & \
       (df['Expiry_y'] < df['Expiry_x'] + MonthEnd(4))

df = df[mask].drop('Expiry_y', 1)
print (df)
     Expiry_x       K Type     close  A           F
0  2018-01-26  123.00    C  0.406250  1  123.125000
3  2018-01-26  124.00    C  0.062500  1  123.125000
6  2018-01-26  125.00    C  0.015625  1  123.125000
9  2018-01-26  121.50    C  1.640625  1  123.125000
12 2018-02-23  123.50    C  0.406250  1  123.125000
15 2018-02-23  127.50    C  0.015625  1  123.125000
18 2018-02-23  124.50    C  0.140625  1  123.125000
21 2018-02-23  125.50    C  0.046875  1  123.125000
25 2018-05-25  120.00    C  3.156250  1  122.734375
28 2018-05-25  121.00    C  2.203125  1  122.734375
31 2018-05-25  122.00    C  1.328125  1  122.734375
33 2018-02-23  123.00    C  0.640625  1  123.125000
36 2018-02-23  124.00    C  0.234375  1  123.125000
39 2018-02-23  121.50    C  1.750000  1  123.125000
42 2018-02-23  126.50    C  0.015625  1  123.125000
45 2018-02-23  122.50    C  0.953125  1  123.125000
49 2018-03-23  123.25    P  0.484375  1  122.734375
52 2018-03-23  123.50    P  0.625000  1  122.734375
55 2018-03-23  123.75    P  0.796875  1  122.734375
58 2018-03-23  127.25    P  4.125000  1  122.734375
61 2018-03-23  127.50    P  4.375000  1  122.734375

时间

没有太大的区别,所以如果只使用400行 DataFrame 时间对两种解决方案都有好处。

如果数据较大,时间应该不同,但没有经过测试。

In [177]: %%timeit
     ...: from pandas.tseries.offsets import MonthEnd
     ...: def find_F(df1):
     ...:     F = df2.loc[(df2.index > df1 + MonthEnd(1)) &
     ...:              (df2.index < df1 + MonthEnd(4)), 'F']
     ...:     return F.values[0]
     ...: 
     ...: df1['F'] = df1['Expiry'].apply(find_F)
     ...: 
100 loops, best of 3: 15.7 ms per loop

In [178]: %%timeit
     ...: df = pd.merge(df1.assign(A=1), df2.reset_index().assign(A=1)[['A','Expiry','F']], on='A')
     ...: mask = (df['Expiry_y'] > df['Expiry_x'] + MonthEnd(1)) & \
     ...:        (df['Expiry_y'] < df['Expiry_x'] + MonthEnd(4))
     ...: 
     ...: df = df[mask].drop('Expiry_y', 1)
     ...: 
100 loops, best of 3: 9.48 ms per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据条件将行添加到 PySpark df

根据其他列中的值将新列添加到df

通过DFs列上的条件将权重列添加到pandas DF

将基于条件的列添加到 df 的有效方法

熊猫根据第二个df中的值将列添加到df中

将工作日添加到 df 列

根据日期时间将df2中的多行添加到df1中

将UUID添加到熊猫DF

比较两个数据帧,如何根据条件和范围将ID从一个df添加到第二个

使用lamdba函数根据其他列将列添加到df中>创建了列,但值是1:全部相同和2:内存编号

将工作日添加到基于其他列的pandas df日期列

将列添加到使用 groupby 计算不同列数的 df

Zend_Pdf将Verdana字体添加到PDF

将N行连续添加到Pandas DF中

Purr映射将分析输出添加到df

如何将重复的行添加到Pandas DF?

将href添加到熊猫.read_html DF

将固定值添加到 DF

R.将列添加到df,其中行具有列表中元素的名称

如何将多索引列添加到现有 df,保留原始索引

如何将列表名称添加到df作为数据框的列

寻找使用字典将动态列添加到pandas df的有效方法

Pandas 在 group_by 和 value_counts 之后将列添加到 df

绘制graph_objects将df列添加到hovertemplate

循环3次并每次将新值添加到spark DF中的新列

将总计添加到 df 中的所有行和列

以迭代方式将 tibble 列添加到 df 的更好方法

当两个变量与第二个DF匹配时,将列添加到DF

根据复杂条件将列添加到pandas数据透视表