我是python新手,正在努力解决这个问题。我想写一个程序,允许我,对于“a”中的每个值,在“b”中找到上面所有值的累积差值,并将其写入一个新的列“c”。我有一个Pandas数据框,如下所示:
import pandas as pd
df = pd.DataFrame({'a': [10, 15, 25, 30, 10, 20], 'b': [ 10, 'na', 20, 'na', 30, 10]})
Index| a | b |
0 | 10 | 10 |
1 | 15 | na |
2 | 25 | 20 |
3 | 30 | na |
4 | 10 | 30 |
5 | 20 | 10 |
我想跳过nas。b中的项是大于零的值,因此如果这样做更容易,我可以将nas更改为0,并且仍然跳过所有0值。
理想情况下,我希望有一个新的专栏 df['c']
这样地:
Index| a | b | c |
0 | 10 | 10 | 0 | # 10-10 = 0
1 | 15 | na | 5 | # 15 - 10 = 5
2 | 25 | 20 | 20 | # (25-20) + (25-10) = 5 + 15 = 20
3 | 30 | na | 30 | # (30-20) + (30-10) = 10+20 = 30
4 | 10 | 30 |-30 | # (10-30) + (10-20) + (10-10) = -30
5 | 20 | 10 | 10 | # (20-10) + (20-30) + (20-20) + (20-10) = 10
我试过使用 df['c] = cumsum(df['a'] - df['b'])
,但它不能完成任务--我需要减去 df['a']
从其对应的 df['b']
,以及df['b'列中它上面的所有值。
我也试过了 df['c] = df['a'] * len(df['b'].unique()) - cumsum(df['b'])
,但问题是 len(df['b'].unique())
总是相同的长度(不会根据索引而改变),并且b中的数字不一定是唯一的(例如,10出现在索引0和5处)。
谁能给我指出正确的方向吗?
这也是我第一次使用堆栈溢出;如果对我的格式或问题有任何不清楚的地方,请告诉我。谢谢
1条答案
按热度按时间j2datikz1#
你很接近!在第二种方法中,您对数学进行了适当的重构,然而棘手的部分是如何正确地解释
NaN
通过这个片段len(df['b'].unique())
. 可以在以下位置创建遮罩:NaN
值=0和非NaN
值=1,然后将这些值累加,以获得适当的乘法系数:为了简化分解系数的方法,这里有一个中间输出: