如何根据pandas中其他列的值计算新列 - python

Hap*_*yPy 5 python dataframe pandas

假设我的数据框包含以下数据:

>>> df = pd.DataFrame({'a':['l1','l2','l1','l2','l1','l2'],
                       'b':['1','2','2','1','2','2']})
>>> df
    a       b
0  l1       1
1  l2       2
2  l1       2
3  l2       1
4  l1       2
5  l2       2
Run Code Online (Sandbox Code Playgroud)

l1应该对应,1而l2应该对应2.我想创建一个新列' c',对于每一行,c = 1if a = l1和b = 1(或a = l2和b = 2).如果a = l1和b = 2(或a = l2和b = 1)然后c = 0.

生成的数据框应如下所示:

  a         b   c
0  l1       1   1
1  l2       2   1
2  l1       2   0
3  l2       1   0
4  l1       2   0
5  l2       2   1
Run Code Online (Sandbox Code Playgroud)

我的数据框非常大,所以我真的在寻找使用pandas来实现这一目标的最有效方法.

chl*_*nde 8

df = pd.DataFrame({'a': numpy.random.choice(['l1', 'l2'], 1000000),
                   'b': numpy.random.choice(['1', '2'], 1000000)})
Run Code Online (Sandbox Code Playgroud)

假设只有两个不同的值的快速解决方案:

%timeit df['c'] = ((df.a == 'l1') == (df.b == '1')).astype(int)
Run Code Online (Sandbox Code Playgroud)

10个循环,每个循环最好为3:178 ms

@Viktor Kerkes:

%timeit df['c'] = (df.a.str[-1] == df.b).astype(int)
Run Code Online (Sandbox Code Playgroud)

1个循环,每个循环最好为3:412毫秒

@ user1470788:

%timeit df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)
Run Code Online (Sandbox Code Playgroud)

1个循环,每个循环最好3:363毫秒

@herrfz

%timeit df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)
Run Code Online (Sandbox Code Playgroud)

1个循环,最佳3:387 ms每个循环

  • 有趣的是,但是您的解决方案明显不那么通用。有趣的是,与简单的 lambda 相比,`str[1]` 方法有多糟糕。 (2认同)

Vik*_*kez 6

您还可以使用字符串方法.

df['c'] = (df.a.str[-1] == df.b).astype(int)
Run Code Online (Sandbox Code Playgroud)