这是我的问题的一个简单示例:
data = [{'a': 1, 'b': 2, 'c':10}, {'a':1, 'b': 3, 'c': 10}, {'a':2, 'b': 1, 'c': 20}, {'a':3, 'b': 4, 'c': 30}]
df = pd.DataFrame(data)
print(df)
a b c
0 1 2 10
1 1 3 10
2 2 1 20
3 3 4 30
现在,我想创建一个新列'd',如果[i] == a [j]和b [i]!= b [j],则减去'c'
我的预期结果是:
a b c d
0 1 2 10 0
1 1 3 10 0
2 2 1 20
3 3 4 30
我已经做了一个循环,但是我需要花费太多时间来制作超过17000行并且是python的新手我想知道是否有更快的方法?
我扩展了你的例子:
data = [{'a': 1, 'b': 2, 'c':10}, {'a':1, 'b': 3, 'c': 10}, {'a':1, 'b':3, 'c':20}, {'a':1, 'b':4, 'c':30},
{'a':2, 'b': 1, 'c': 20}, {'a':3, 'b': 4, 'c': 30},
{'a': 3, 'b': 5, 'c':100}]
df = pd.DataFrame(data)
# raw data:
a b c
0 1 2 10
1 1 3 10
2 1 3 20
3 1 4 30
4 2 1 20
5 3 4 30
6 3 5 100
添加列d
:
df["d"] = df["c"].diff()[(df["a"].diff().eq(0)) & (df["b"].diff().ne(0))]
结果:
a b c d
0 1 2 10 NaN
1 1 3 10 0.0
2 1 3 20 NaN
3 1 4 30 10.0
4 2 1 20 NaN
5 3 4 30 NaN
6 3 5 100 70.0
注意索引2没有值,因为b[i] == b[i-1]
编辑:
为每条评论添加了额外的限制:
# remove cases promised to not be there.
data = [{'a': 1, 'b': 2, 'c':10}, {'a':1, 'b': 3, 'c': 10},
{'a':2, 'b': 1, 'c': 20}, {'a':3, 'b': 4, 'c': 30},
{'a': 3, 'b': 5, 'c':100}]
df = pd.DataFrame(data)
# raw data:
a b c
0 1 2 10
1 1 3 10
4 2 1 20
5 3 4 30
6 3 5 100
# Get `d`
df["d"] = df["c"].diff()[(df["a"].diff().eq(0)) & (df["b"].diff().ne(0))]
df["d"] = df["d"].combine_first(df["d"].shift(-1))
# result:
a b c d
0 1 2 10 0.0
1 1 3 10 0.0
2 2 1 20 NaN
3 3 4 30 70.0
4 3 5 100 70.0