gpt4 book ai didi

python - 按键更新 pandas DataFrame

转载 作者:太空狗 更新时间:2023-10-29 22:11:38 24 4
gpt4 key购买 nike

我有一个历史股票交易的数据框。该框架包含 ['ticker'、'date'、'cusip'、'profit'、'security_type'] 等列。最初:

trades['cusip'] = np.nan
trades['security_type'] = np.nan

我有历史配置文件,我可以加载到具有 ['ticker'、'cusip'、'date'、'name'、'security_type'、'primary_exchange'] 等列的框架中。

我想用配置中的 cusip 和 security_type 更新交易框架,但仅限于代码和日期匹配的地方。

我以为我可以做这样的事情:

pd.merge(trades, config, on=['ticker', 'date'], how='left')

但这并没有更新列,它只是将配置列添加到交易中。

以下是可行的,但我认为必须有更好的方法。如果没有,我可能会在 pandas 之外进行。

for date in trades['date'].unique():
config = get_config_file_as_df(date)
## config['date'] == date
for ticker in trades['ticker'][trades['date'] == date]:
trades['cusip'][
(trades['ticker'] == ticker)
& (trades['date'] == date)
] \
= config['cusip'][config['ticker'] == ticker].values[0]

trades['security_type'][
(trades['ticker'] == ticker)
& (trades['date'] == date)
] \
= config['security_type'][config['ticker'] == ticker].values[0]

最佳答案

假设您有这样的设置:

import pandas as pd
import numpy as np
import datetime as DT

nan = np.nan

trades = pd.DataFrame({'ticker' : ['IBM', 'MSFT', 'GOOG', 'AAPL'],
'date' : pd.date_range('1/1/2000', periods = 4),
'cusip' : [nan, nan, 100, nan]
})
trades = trades.set_index(['ticker', 'date'])
print(trades)
# cusip
# ticker date
# IBM 2000-01-01 NaN
# MSFT 2000-01-02 NaN
# GOOG 2000-01-03 100 # <-- We do not want to overwrite this
# AAPL 2000-01-04 NaN

config = pd.DataFrame({'ticker' : ['IBM', 'MSFT', 'GOOG', 'AAPL'],
'date' : pd.date_range('1/1/2000', periods = 4),
'cusip' : [1,2,3,nan]})
config = config.set_index(['ticker', 'date'])

# Let's permute the index to show `DataFrame.update` correctly matches rows based on the index, not on the order of the rows.
new_index = sorted(config.index)
config = config.reindex(new_index)
print(config)
# cusip
# ticker date
# AAPL 2000-01-04 NaN
# GOOG 2000-01-03 3
# IBM 2000-01-01 1
# MSFT 2000-01-02 2

然后您可以使用 DataFrame.update 方法使用 config 中的值更新 trades 中的 NaN 值。请注意,DataFrame.update 根据索引匹配行(这就是上面调用 set_index 的原因)。

trades.update(config, join = 'left', overwrite = False)
print(trades)

# cusip
# ticker date
# IBM 2000-01-01 1
# MSFT 2000-01-02 2
# GOOG 2000-01-03 100 # If overwrite = True, then 100 is overwritten by 3.
# AAPL 2000-01-04 NaN

关于python - 按键更新 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com