在列与另一列匹配的地方用值填充新列

2024-06-16 15:59:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个数据帧

name   | datetime | price
---------------------------
APL    |  10-1-12 | 1.92  
BBC    |  10-1-12 | 4.16
CPL    |  10-1-12 | 4.99
APL    |  10-2-12 | 2.05
BBC    |  10-2-12 | 5.16
CPL    |  10-2-12 | 3.99

我想创建一个新的专栏:APL\u price,以及其他任何一个专栏 名字的datetime与APL的datetime匹配,我想用 当时的APL价格如下:

name   | datetime | price | APL_price
-------------------------------------
APL    |  10-1-12 | 1.92  | 1.92 (or null is ok)
BBC    |  10-1-12 | 4.16  | 1.92
CPL    |  10-1-12 | 4.99  | 1.92
APL    |  10-2-12 | 2.05  | 2.05 (or null)
BBC    |  10-2-12 | 5.16  | 2.05
CPL    |  10-2-12 | 3.99  | 2.05

我在考虑写一个helper函数来遍历所有的东西 找到一个日期时间匹配,但不确定是否有更快的方法。你知道吗


Tags: or数据namehelperdatetimeisok价格
1条回答
网友
1楼 · 发布于 2024-06-16 15:59:12

您可以通过^{}为没有值的所有值NaN创建APL,然后通过ffill向前填充来替换NaN

df['APL_price'] = df['price'].where(df['name'] == 'APL').ffill()

^{}!=反转掩模的替代解决方案:

df['APL_price'] = df['price'].mask(df['name'] != 'APL').ffill()

print (df)
  name  datetime  price  APL_price
0  APL     10112   1.92       1.92
1  BBC     10112   4.16       1.92
2  CPL     10112   4.99       1.92
3  APL     10212   2.05       2.05
4  BBC     10212   5.16       2.05
5  CPL     10212   3.99       2.05

细节:

print (df['price'].where(df['name'] == 'APL'))
0    1.92
1     NaN
2     NaN
3    2.05
4     NaN
5     NaN
Name: price, dtype: float64

更一般的解决方案在第一步中是类似的,但随后使用groupbyby datetimes和ffill以及bfiil来替换两个方向的NaNs:

name = 'BBC'
df[name + '_price'] = df['price'].where(df['name'] == name)
df[name + '_price'] = (df.groupby('datetime')[name + '_price']
                         .apply(lambda x: x.ffill().bfill()))
print (df)
  name  datetime  price  BBC_price
0  APL     10112   1.92       4.16
1  BBC     10112   4.16       4.16
2  CPL     10112   4.99       4.16
3  APL     10212   2.05       5.16
4  BBC     10212   5.16       5.16
5  CPL     10212   3.99       5.16

相关问题 更多 >