[英]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,请告诉我
您可以使用reindex
将df2
与df1["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.