在熊猫的几个条件下的新操作栏

问题描述 投票:2回答:1

这是我的问题的一个简单示例:

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的新手我想知道是否有更快的方法?

python pandas
1个回答
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

注意索引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
© www.soinside.com 2019 - 2024. All rights reserved.