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

时间:2013-08-27 18:11:09

标签: python pandas dataframe

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

>>> 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应与1相对应,而l2应与2相对应。 我想创建一个新列“c”,以便每行c = 1 a = l1b = 1(或a = l2和{{ 1}})。如果b = 2a = l1(或b = 2a = l2),则b = 1

结果数据框应如下所示:

c = 0

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

4 个答案:

答案 0 :(得分: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 ms

@Viktor Kerkes:

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

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

@ user1470788:

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

1个循环,最好为每个循环3:363 ms

@herrfz

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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