[英]how to compute a new column based on the values of other columns in pandas - python
假设我的数据框包含以下数据:
>>> 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
',这样,对于每一行,如果a = l1
且b = 1
(或a = l2
和b = 2
),则c = 1
。 如果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
我的数据框非常大,所以我真的在寻找使用pandas来实现这一目标的最有效方法。
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毫秒
@herrfz
%timeit df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)
1个循环,最佳3:387 ms每个循环
您还可以使用字符串方法。
df['c'] = (df.a.str[-1] == df.b).astype(int)
df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)
您可以使用逻辑运算符。 我不确定你为什么使用1和2的字符串而不是整数,但这是一个解决方案。 最后的astype将它从布尔值转换为0和1。
df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.