繁体   English   中英

根据 Python pandas 中的列数据比较两个数据帧

[英]Compare two dataframes based on column data in Python pandas

我有两个数据框,df1 和 df2,我想从 df1 子结构 df2 并将特定列“代码”用作行比较

import pandas as pd
import numpy as np
rng = pd.date_range('2021-01-01', periods=10, freq='D')
df1 = pd.DataFrame(index=rng, data={'Val1': range(10), 'Val2': np.array(range(10))*5, 'Code': [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]})

df2 = pd.DataFrame(data={'Code': [1, 2, 3, 4], 'Val1': [10, 5, 15, 20], 'Val2': [4, 8, 10, 7]})

df1:

            Val1  Val2  Code
2021-01-01     0     0     1
2021-01-02     1     5     1
2021-01-03     2    10     1
2021-01-04     3    15     2
2021-01-05     4    20     2
2021-01-06     5    25     2
2021-01-07     6    30     3
2021-01-08     7    35     3
2021-01-09     8    40     3
2021-01-10     9    45     3

df2:

   Code  Val1  Val2
0     1    10     4
1     2     5     8
2     3    15    10
3     4    20     7

我使用以下代码:

df = (df1.set_index(['Code']) - df2.set_index(['Code']))

结果是

Code            
1    -10.0  -4.0
1     -9.0   1.0
1     -8.0   6.0
2     -2.0   7.0
2     -1.0  12.0
2      0.0  17.0
3     -9.0  20.0
3     -8.0  25.0
3     -7.0  30.0
3     -6.0  35.0
4      NaN   NaN

但是,我只想获取 df1 中的行的结果,而不是缺少的键,在本例中为 4。

我该怎么做,然后将索引从 df1 设置回原始索引?

类似的东西,但它不起作用:

df = (df1.set_index(['Code']) - df2.set_index(['Code'])).set_index(df1['Code'])

我也想保留列的标题。

所需的 output:

            Val1  Val2  Code
Date                        
2021-01-01 -10.0  -4.0     1
2021-01-02  -9.0   1.0     1
2021-01-03  -8.0   6.0     1
2021-01-04  -2.0   7.0     2
2021-01-05  -1.0  12.0     2
2021-01-06   0.0  17.0     2
2021-01-07  -9.0  20.0     3
2021-01-08  -8.0  25.0     3
2021-01-09  -7.0  30.0     3
2021-01-10  -6.0  35.0     3

如果要获取 df1 中的行而不是缺少的键的结果,在此示例中,4 然后只需使用drop_na()方法

df = (df1.set_index(['Code']) - df2.set_index(['Code'])).dropna()

然后:-

df.insert(0,'Date',df1.index)

最后:-

df.reset_index(inplace=True)
df.set_index('Date',inplace=True)

现在,如果您打印df ,您将获得所需的 output:-

           Code  Val1   Val2
Date            
2021-01-01  1   -10.0   -4.0
2021-01-02  1   -9.0    1.0
2021-01-03  1   -8.0    6.0
2021-01-04  2   -2.0    7.0
2021-01-05  2   -1.0    12.0
2021-01-06  2   0.0     17.0
2021-01-07  3   -9.0    20.0
2021-01-08  3   -8.0    25.0
2021-01-09  3   -7.0    30.0
2021-01-10  3   -6.0    35.0

注意:-如果这不是您想要的 output,请告诉我

您可以使用reindexdf2df1["code"]对齐。 然后我们可以采用底层 numpy ndarray 并从相应的列df1中减去它。 这将使索引和“代码”列保持不变并按预期执行减法。

subtract_values = df2.set_index("Code").reindex(df1["Code"]).to_numpy()
df1[["Val1", "Val2"]] -= subtract_values

print(df1)
            Val1  Val2  Code
2021-01-01   -10    -4     1
2021-01-02    -9     1     1
2021-01-03    -8     6     1
2021-01-04    -2     7     2
2021-01-05    -1    12     2
2021-01-06     0    17     2
2021-01-07    -9    20     3
2021-01-08    -8    25     3
2021-01-09    -7    30     3
2021-01-10    -6    35     3

如果您不想更改df1 ,可以通过new_df = df1.copy()将数据复制到新的DataFrame并继续使用new_df而不是df1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM