提问人:Abhishek Banerjee 提问时间:11/14/2023 最后编辑:Abhishek Banerjee 更新时间:11/14/2023 访问量:55
在 pandas 中将数据帧与重复行合并
Merge dataframes with duplicated rows in pandas
问:
我有三个数据帧。
df1 =
股票 | 入场价 | 入职日期 |
---|---|---|
哈维尔斯 | 1306.6 | 2015-01-02 |
特里图尔 | 115.43 | 2015-01-02 |
df2 =
股票 | 退出价格 | 退出日期 |
---|---|---|
大不列颠 | 1200 | 2015-01-09 |
特里图尔 | 111.41 | 2015-01-09 |
df3 =
股票 | 入场价 | 入职日期 |
---|---|---|
特里图尔 | 112.01 | 2015-01-16 |
我想将这三个 DataFrame 组合在一起,给出以下形式的结果 DataFrame:
df =
股票 | 入场价 | 入职日期 | 退出价格 | 退出日期 |
---|---|---|---|---|
哈维尔斯 | 1306.6 | 2015-01-02 | 日期价格 p | p |
大不列颠 | 日期价格 q | q | 1200 | 2015-02-09 |
特里图尔 | 115.43 | 2015-01-02 | 111.41 | 2015-01-09 |
特里图尔 | 112.01 | 2015-01-16 | 日期价格 p | p |
其中 和 已定义为当前月份的最后一天,以及当前月份的第一天,因此是 .p
q
prices on date p and q
我尝试使用 groupby,但这似乎不起作用。 请帮忙。
答:
1赞
mozway
11/14/2023
#1
IIUC,您可以根据进入/退出状态对数据帧进行排序,然后在使用
groupby.cumcount
对每个 Ticker 进行重复数据删除后连接它们:
dfs = [df1, df2, df3]
entry = []
exit = []
for x in dfs:
if 'Entry Price' in x.columns:
entry.append(x)
else:
exit.append(x)
out = (pd.concat([pd.concat(entry)
.sort_values(by='Entry Date',
ignore_index=True)
.assign(n=lambda d: d.groupby('Ticker').cumcount())
.set_index(['Ticker', 'n']),
pd.concat(exit)
.sort_values(by='Exit Date',
ignore_index=True)
.assign(n=lambda d: d.groupby('Ticker').cumcount())
.set_index(['Ticker', 'n'])],
axis=1)
.reset_index('Ticker')
.fillna({'Entry Price': 'Price on date q',
'Entry Date': 'q',
'Exit Price': 'Price on date p',
'Exit Date': 'p',
})
.reset_index(drop=True)
)
输出:
Ticker Entry Price Entry Date Exit Price Exit Date
0 HAVELLS 1306.6 2015-01-02 Price on date p p
1 TRITUR 115.43 2015-01-02 111.41 2015-01-09
2 TRITUR 112.01 2015-01-16 Price on date p p
3 BRITANNIA Price on date q q 1200.0 2015-01-09
评论
2015-01-16
2015-01-02