我有两个数据框:
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天没有值,因此不应进行算术运算。我在这部分上遇到麻烦。
我正在寻找的输出是
答案 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)
您可以使用map
或merge
。这是一个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