如何减去参考 pandas 中关联列的行值
How to subtract row values in reference to the associated columns in pandas
我想根据其他列中的值减去行中的连续值。
数据框如下所示:
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()
在整个数据框中完成此操作,但这里它就像 (key, value),其中键来自 A 列,多个值来自 B 列。我想减去 B 列中的值,只要 A 列中的键是 "Sat" 并且当它遇到 A 列中的第二个键 "Sun" 时应该重新开始减法。
对解决这个问题有什么帮助吗?
如有必要,首先sort_values
by column A
, then use groupby
with diff
, for replace 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
, where add 0
if mask
is not equal with shift
ed column A
by ne
的另一个解决方案:
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
假设列 '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
计时
小数据
数据较大
我想根据其他列中的值减去行中的连续值。
数据框如下所示:
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()
在整个数据框中完成此操作,但这里它就像 (key, value),其中键来自 A 列,多个值来自 B 列。我想减去 B 列中的值,只要 A 列中的键是 "Sat" 并且当它遇到 A 列中的第二个键 "Sun" 时应该重新开始减法。
对解决这个问题有什么帮助吗?
如有必要,首先sort_values
by column A
, then use groupby
with diff
, for replace 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
, where add 0
if mask
is not equal with shift
ed column A
by ne
的另一个解决方案:
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
假设列 '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
计时
小数据
数据较大