Python 合并熊猫数据帧:选择较小的绝对值
我有两个熊猫数据帧: 数据帧A:Python 合并熊猫数据帧:选择较小的绝对值,python,python-3.x,pandas,dataframe,absolute-value,Python,Python 3.x,Pandas,Dataframe,Absolute Value,我有两个熊猫数据帧: 数据帧A: date ticker return 2017-01-03 CRM 0.018040121229614625 2017-01-03 MSFT -0.0033444816053511683 2017-01-04 CRM 0.024198086662915008 2017-01-04 MSFT -0.0028809218950064386 2017-01-05 CRM -0.000274687542919
date ticker return
2017-01-03 CRM 0.018040121229614625
2017-01-03 MSFT -0.0033444816053511683
2017-01-04 CRM 0.024198086662915008
2017-01-04 MSFT -0.0028809218950064386
2017-01-05 CRM -0.0002746875429199269
2017-01-05 MSFT 0.0017687731146487362
数据帧B:
date ticker return
2017-01-03 CRM 0.018040120991250852
2017-01-03 MSFT -0.003344466975803595
2017-01-04 CRM 0.024198103213211475
2017-01-04 MSFT -0.0028809268004892363
2017-01-05 CRM -0.00027464144673694513
2017-01-05 MSFT 0.0017687829680113065
现在我需要第三个“整合”数据帧:
- 相同的列名
- 对于每一行,我必须从DataframeA或DataframeB中选择绝对值较小的“返回”数据
有什么建议吗?您可以使用
concat
加入两个dataframe
,然后使用groupby
按ticker
分组,并获得每组的最小值:
df3=pd.concat([df1,df2]).groupby('ticker').min().reset_index()
这是用可运行代码编辑的新答案 即使行数不相等,下面的代码也可以工作。它将首先获取两个数据帧上的公共行,然后为所需列找到正确的值
将numpy导入为np
作为pd进口熊猫
##创建虚拟数据以获取可运行代码
## ---------------------------------------
n_行=20
子类别=np.random.choice(4,大小=n行)
dic1={
“a”:列表(范围(n_行)),
“b”:子类别,
“c”:np.random.randn(n_行)
}
dic2={
“a”:范围(n_行),
“b”:子类别,
“c”:np.random.randn(n_行)
}
df1=局部数据帧(dic1)
df1.drop(index=list(np.random.choice(n_行,5,replace=False)),inplace=True)
df2=局部数据帧(dic2)
df2.drop(index=list(np.random.choice(n_行,3,replace=False)),inplace=True)
##主要答覆
## ---------------------------------------------------------
##合并df1和df2,然后创建新的基于c的列,该列取min(abs(c_1,c_2))
result=df1.merge(df2,how=“internal”,on=[“a”,“b”],后缀=[“_1”,“_2”])。copy()
结果[“c”]=结果[“c_1”]。其中(np.abs(结果[“c_1”)尝试concat+groupby
onreturn
并使用key=abs
返回min
:
(pd.concat((A,B),ignore_index=True)
.groupby(['date','ticker'])['return'].min(key=abs).reset_index())
,而是将它们作为文本发布,以便人们能够重现您的问题我刚刚纠正了这一点,谢谢,(pd.concat((A,B),ignore_index=True)。groupby(['date','ticker'])['return']。apply(lambda x:x.abs().min())。reset_index())
?差不多了。您正在用abs值填充新的panda。这不是我需要的。我需要用dataframeA或dataframeB“return”列填充较小的绝对值。您还必须在groupby中包含日期。此外,OP需要绝对最小值。您可以执行df1[“return”]=np.where(np.abs(df1[“return”]))是的,我只是分两步打破了这一点,以便于澄清。如果我在dataframeA和dataframeB中有相同数量的行,那么它是有效的。如果我在dataframeA中有一些在dataframeB中不存在的行,如何获得它?谢谢lot@user2132478Plz检查上面编辑过的答案,现在它应该可以使用不同的行数,:)别忘了标记“已解决”是否有效如果我有第二列,是否必须对每列重复该操作?或者可以在同一行中完成?
(pd.concat((A,B),ignore_index=True)
.groupby(['date','ticker'])['return'].min(key=abs).reset_index())
date ticker return
0 2017-01-03 CRM 0.018040
1 2017-01-03 MSFT -0.003344
2 2017-01-04 CRM 0.024198
3 2017-01-04 MSFT -0.002881
4 2017-01-05 CRM -0.000275
5 2017-01-05 MSFT 0.001769