这是我的问题的一个简单例子:
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',如果a [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的新手,我想知道是否没有更快的方法?
答案 0 :(得分:2)
我已经扩展了您的示例:
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
请注意,由于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