在 pandas 中将数据帧与重复行合并

Merge dataframes with duplicated rows in pandas

提问人:Abhishek Banerjee 提问时间:11/14/2023 最后编辑:Abhishek Banerjee 更新时间:11/14/2023 访问量:55

问:

我有三个数据帧。

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

其中 和 已定义为当前月份的最后一天,以及当前月份的第一天,因此是 .pqprices on date p and q

我尝试使用 groupby,但这似乎不起作用。 请帮忙。

Pandas DataFrame 合并

评论

2赞 mozway 11/14/2023
怎么变成的?2015-01-162015-01-02
0赞 Abhishek Banerjee 11/14/2023
这是一个错别字,我已经纠正了。非常感谢您指出这一点。
1赞 mozway 11/14/2023
那么,每个数据帧都有一个进入或退出数据?你想让它们井井有条吗?
0赞 Abhishek Banerjee 11/14/2023
是的,在最后一个条目之后,我想用预定义的值填写退出日期。
0赞 mozway 11/14/2023
每个输入数据帧是否只有一行?如果有不同的代码会怎样?

答:

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