Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并熊猫数据帧:选择较小的绝对值_Python_Python 3.x_Pandas_Dataframe_Absolute Value - Fatal编程技术网

Python 合并熊猫数据帧:选择较小的绝对值

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

我有两个熊猫数据帧:

数据帧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.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
on
return
并使用
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