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

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

最佳答案

我扩展了您的示例:

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

关于python - Pandas 在多种条件下的新运营专栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55633465/

10-10 20:23