如何在引用pandas

时间:2017-04-10 06:51:57

标签: python pandas dataframe subtraction

我想在行中减去连续值,并引用其他列中的值。

数据框如下所示:

     A        B    
1   "Sat"     7  
2   "Sat"     9
3   "Sat"     5
4   "Sun"     8  
5   "Sun"     4
6   "Sun"     6

我想在参考A列时减去B列的连续值,输出应该是这样的:

     A        B    
1   "Sat"     0  
2   "Sat"    +2
3   "Sat"    -4
4   "Sun"     0  
5   "Sun"    -4
6   "Sun"     2

我一直在使用df.diff()在整个数据框中完成此操作,但在这里它类似于(键,值),其中包含来自A列的键和来自B列的多个值。只要A列中的键是" Sat"我想在B列中减去值。当它遇到A列中的第二个键时," Sun"应该重新开始减法。

解决这个问题的任何帮助?

2 个答案:

答案 0 :(得分:3)

首先必要sort_valuesA,然后groupbydiff一起使用,以替换NaN fillna

df['B'] = df.sort_values('A').groupby('A')['B'].diff().fillna(0)
print (df)
     A    B
1  Sat  0.0
2  Sat  2.0
3  Sat -4.0
4  Sun  0.0
5  Sun -4.0
6  Sun  2.0

如果需要转发到int

df['B'] = df.sort_values('A').groupby('A')['B'].diff().fillna(0).astype(int)
print (df)
     A  B
1  Sat  0
2  Sat  2
3  Sat -4
4  Sun  0
5  Sun -4
6  Sun  2

使用diff的另一个解决方案,如果maskshift ne startParam 0不相等,则添加A

df['B'] = df.B.diff().mask(df.A.ne(df.A.shift()), 0)
print (df)
     A    B
1  Sat  0.0
2  Sat  2.0
3  Sat -4.0
4  Sun  0.0
5  Sun -4.0
6  Sun  2.0

答案 1 :(得分:1)

假设列'A'中的组始终在一起

a, b = df.A.values, df.B.values
np.append(0, np.where(a[:-1] == a[1:], np.diff(b), 0))

array([ 0,  2, -4,  0, -4,  2])

我们可以使用

覆盖我的专栏'B'
a, b = df.A.values, df.B.values
df.assign(B=np.append(0, np.where(a[:-1] == a[1:], np.diff(b), 0)))

     A  B
1  Sat  0
2  Sat  2
3  Sat -4
4  Sun  0
5  Sun -4
6  Sun  2

或者我们可以严格遵守pandas

df.assign(B=df.B.diff().where(df.A == df.A.shift(), 0).astype(int))

     A  B
1  Sat  0
2  Sat  2
3  Sat -4
4  Sun  0
5  Sun -4
6  Sun  2

<强> 定时
小数据
enter image description here

更大的数据
enter image description here