Python熊猫,在2个数据帧中找到最大的一对
我有两个数据帧Python熊猫,在2个数据帧中找到最大的一对,python,pandas,Python,Pandas,我有两个数据帧 df_1 AAPL.NSDQ KO.NYSE BAC.NYSE GS.NYSE AAPL.NSDQ 1.000000 0.90526 -0.659031 -0.722537 KO.NYSE 0.050526 1.000000 0.042064 0.146106 BAC.NYSE -0.659031 0.042064 1.000000 0.944912 GS.NYSE -0.722537 0.14610
df_1
AAPL.NSDQ KO.NYSE BAC.NYSE GS.NYSE
AAPL.NSDQ 1.000000 0.90526 -0.659031 -0.722537
KO.NYSE 0.050526 1.000000 0.042064 0.146106
BAC.NYSE -0.659031 0.042064 1.000000 0.944912
GS.NYSE -0.722537 0.146106 0.944912 1.000000
df_2
AAPL.NSDQ KO.NYSE BAC.NYSE GS.NYSE
AAPL.NSDQ 1.000000 3.116503 5.601350 0.557649
KO.NYSE 0.320873 1.000000 1.797319 0.178934
BAC.NYSE 0.178528 0.556384 1.000000 0.099556
GS.NYSE 1.793243 5.588645 10.044580 1.000000
我想检索一个对列表,这样df_1中的对值大于绝对值(0.85),df_2中的对值大于3。然后打印出这一对的列表
例如,结果将是(AAPL.NSDQ,KO.NYSE)
,df_1=0.90526
和df_2=3.116503
谢谢您可以使用矢量化布尔运算:
In [10]: pairs = (np.abs(df1) > 0.85) & (df2 > 3)
In [11]: pairs
Out[11]:
AAPL.NSDQ KO.NYSE BAC.NYSE GS.NYSE
AAPL.NSDQ False True False False
KO.NYSE False False False False
BAC.NYSE False False False False
GS.NYSE False False True False
然后,在numpy.where
的帮助下:
In [14]: np.where(pairs.values)
Out[14]: (array([0, 3]), array([1, 2]))
最后,一个简单的列表理解:
In [16]: [(pairs.index[i], pairs.columns[j]) for i,j in zip(*np.where(pairs.values))]
Out[16]: [('AAPL.NSDQ', 'KO.NYSE'), ('GS.NYSE', 'BAC.NYSE')]
如果您也需要这些值:
In [20]: [(pairs.index[i], pairs.columns[j], df1.iloc[i,j], df2.iloc[i,j]) for i,j in zip(*np.where(pairs.values))]
Out[20]:
[('AAPL.NSDQ', 'KO.NYSE', 0.90526000000000006, 3.1165029999999998),
('GS.NYSE', 'BAC.NYSE', 0.94491200000000009, 10.04458)]
或者,定义一个助手函数会更简洁:
In [21]: def data_tuple(i, j): return (pairs.index[i], pairs.columns[j], df1.iloc[i,j], df2.iloc[i,j])
In [22]: [data_tuple(i,j) for i,j in zip(*np.where(pairs.values))]
Out[22]:
[('AAPL.NSDQ', 'KO.NYSE', 0.90526000000000006, 3.1165029999999998),
('GS.NYSE', 'BAC.NYSE', 0.94491200000000009, 10.04458)]
你也能告诉我,如何检索号码吗?我想看看类似于
('A.NYSE','B.NYSE',0.9,3)
如何np.where(pairs.values)=(数组([0,3])、数组([1,2])
?它不应该是(数组[0,1],数组[3,2])
,因为这是真值的坐标吗?因为np。其中返回一个元组
,元组的每个元素对应于您传入的布尔数组的一个轴,并且在数组为真
的位置具有索引值。你写的东西没有任何意义,因为(数组[0,1],数组[3,2])==(真的,真的)
对不起,我还是不明白为什么在[14]:np.where(pairs.values)Out[14]:(数组([0,3]),数组([1,2])
我现在明白了。它代表的是Array[x1,x2],Array[y1,y2]
我以为它是Array[x1,y1],Array[x2,y2]
df = pd.concat([df_1[df_1 > 0.85].stack().dropna(), df_2[df_2 > 3].stack().dropna()], axis=1).dropna()
df.columns=['df_1', 'df_2']
print df.index.tolist()
[('AAPL.NSDQ', 'KO.NYSE'), ('GS.NYSE', 'BAC.NYSE')]
print df
df_1 df_2
AAPL.NSDQ KO.NYSE 0.905260 3.116503
GS.NYSE BAC.NYSE 0.944912 10.044580