熊猫在多种条件下的新运营专栏

时间:2019-04-11 13:18:06

标签: python pandas

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

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

1 个答案:

答案 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]

,索引2为何没有值

编辑:

添加了每个评论的额外限制:

# 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