6

假设我的数据框包含这些数据:

>>> 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

l1应该对应,1l2应该对应2。我想创建一个新列' c',这样,对于每一行,c = 1如果a = l1b = 1(或a = l2b = 2)。如果a = l1b = 2(或a = l2b = 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

我的数据框非常大,所以我真的在寻找使用熊猫的最有效方法。

4

4 回答 4

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

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

%timeit df['c'] = ((df.a == 'l1') == (df.b == '1')).astype(int)

10 个循环,3 个循环中的最佳:每个循环 178 毫秒

@维克多·科克斯:

%timeit df['c'] = (df.a.str[-1] == df.b).astype(int)

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

@用户1470788:

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

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

@herrfz

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

1 个循环,3 个循环中的最佳:每个循环 387 毫秒

于 2013-08-27T18:54:51.747 回答
6

您也可以使用字符串方法。

df['c'] = (df.a.str[-1] == df.b).astype(int)
于 2013-08-27T18:32:04.430 回答
1

df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)

于 2013-08-27T18:25:31.517 回答
-1

您可以只使用逻辑运算符。我不确定你为什么使用 1 和 2 的字符串而不是整数,但这里有一个解决方案。最后的 astype 将其从布尔值转换为 0 和 1。

df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)

于 2013-08-27T18:32:08.770 回答