根据索引值从两个数据框中减去行

时间:2020-03-04 23:58:26

标签: python pandas

我有两个数据框:

df1 = pd.DataFrame({
    'Name' : ['A', 'A', 'A', 'A', 'B', 'B'],
    'Value': [10, 9, 8, 10, 99 , 88],
    'Day' : [1,2,3,4,1,2]
})

df2 = pd.DataFrame({
    'Name' : ['C', 'C', 'C', 'C'],
    'Value': [1,2,3,4],
    'Day' : [1,2,3,4]
})

我想基于一天用df1中的值减去df2中的值,并创建一个名为delta_values的新数据框。如果当天没有条目,则不应执行任何操作。

进一步说明:名称列中的B仅具有第1天和第2天的值。df2应该用B的第1天和第2天的值相减。第1天和第2天,但由于B在第3天和第4天没有值,因此不应进行算术运算。我在这部分上遇到麻烦。

我正在寻找的输出是

output

3 个答案:

答案 0 :(得分:0)

如果没有什么比其他人想的更好的了,这是一个正确但不是很好的解决方案:

results = df1.set_index(['Day','Name']).unstack()['Value']\
             .subtract(df2.set_index('Day')['Value'], axis=0)\
             .stack().reset_index()

使结果看起来像预期的输出:

result.columns = 'Day', 'Name', 'Value'
result.Value = result.Value.astype(int)
result.sort_values(['Name', 'Day'], inplace=True)
result = result[['Name', 'Value', 'Day']]

答案 1 :(得分:0)

我们可以合并merged = df1.merge(df2, how='inner', on='Day', suffixes=('', '_y')) print(merged) Name Value Day Name_y Value_y 0 A 10 1 C 1 1 A 9 2 C 2 2 A 8 3 C 3 3 A 10 4 C 4 4 B 99 1 C 1 5 B 88 2 C 2 delta_values = df1.copy() delta_values['Value'] = merged['Value'] - merged['Value_y'] print(delta_values) Name Value Day 0 A 9 1 1 A 7 2 2 A 5 3 3 A 6 4 4 B 98 1 5 B 86 2 列上的两个DataFrame,然后从中减去。

 enter code here
import java.util.ArrayList;
import java.util.List;

public final class LinkedBag<T> implements PrimaryDataStructureBagInterface<T> {

private Node firstNode;
private int numberOfEntries;

public LinkedBag() {
    firstNode = null;
    numberOfEntries = 0;
}

@Override
public boolean removeAllOccurrences(T[][] entries) {
    // convert 2d into 1d array
    List<Character> list = new ArrayList<Character>();
    for(int i =0; i< entries.length; i++) {
        for(int j =0; j< entries[i].length; j++){
            list.add((Character) entries[i][j]);

答案 2 :(得分:0)

您可以使用mapmerge。这是一个map解决方案:

delta_values = df1.copy()
delta_values['Value'] -= delta_values['Day'].map(df2.set_index('Day')['Value']
                                                ).fillna(0)

输出:

  Name  Value  Day
0    A      9    1
1    A      7    2
2    A      5    3
3    A      6    4
4    B     98    1
5    B     86    2
相关问题