Python 基于来自同一数据帧的其他列的集合为列赋值

Python 基于来自同一数据帧的其他列的集合为列赋值,python,pandas,lambda,conditional-statements,Python,Pandas,Lambda,Conditional Statements,对于数据帧,我有一列,名为TM52\u fail 2 1 - 1 & 2 1 & 2 & 3 - - 3 etc. 我想创建一个额外的专栏,名为TM52\u fail\u norm,它的内容取决于专栏TM52\u fail的内容。 我的尝试(包括条件填充): 返回一个空列(我认为这是df['TM52\u fail\u norm']=“”)的结果。我认为您需要强制转换为字符串,然后将函数str\u应用于编号: df['new'] = df['TM52_fail_norm'

对于数据帧,我有一列,名为
TM52\u fail

2
1
-
1 & 2
1 & 2 & 3
-
-
3
etc.
我想创建一个额外的专栏,名为
TM52\u fail\u norm
,它的内容取决于专栏
TM52\u fail
的内容。 我的尝试(包括条件填充):


返回一个空列(我认为这是df['TM52\u fail\u norm']=“”)的结果。

我认为您需要强制转换为字符串,然后将函数
str\u应用于编号

df['new'] = df['TM52_fail_norm'].astype(str).apply(str_to_number)
print (df)
  TM52_fail_norm  new
0              2    1
1              1    1
2              -    0
3          1 & 2    2
4      1 & 2 & 3    3
5              -    0
6              -    0
7              3    1
另一个解决方案是通过
dict
,最后需要通过
0
并转换为
int

d = {'1':1,'2':1,'3':1,'1 & 2':2, '2 & 3':2, '1 & 3':2,'1 & 2 & 3':3}

df['new'] = df['TM52_fail_norm'].map(d)
df['new'] = df['new'].fillna(0).astype(int)
print (df)
  TM52_fail_norm  new
0              2    1
1              1    1
2              -    0
3          1 & 2    2
4      1 & 2 & 3    3
5              -    0
6              -    0
7              3    1
计时

#[800000 rows x 1 columns]
df = pd.concat([df]*100000).reset_index(drop=True)

In [315]: %timeit (jez1(df))
10 loops, best of 3: 63 ms per loop

In [316]: %timeit (df['TM52_fail_norm'].astype(str).apply(str_to_number))
1 loop, best of 3: 518 ms per loop

#http://stackoverflow.com/a/40176883/2901002
In [345]: %timeit (df.TM52_fail_norm.str.count('\d+'))
1 loop, best of 3: 707 ms per loop


def jez1(df):
    d = {'1':1,'2':1,'3':1,'1 & 2':2, '2 & 3':2, '1 & 3':2,'1 & 2 & 3':3}

    df['new'] = df['TM52_fail_norm'].map(d)
    df['new'] = df['new'].fillna(0).astype(int)
    return (df)

print (jez1(df))

TL;DR:
df.TM52\u fail.str.count('\d+')

看起来你真正想要的是数一数数字。这里,pandas的
.str
访问器方法(,)非常有用

我想
TM52_fail
是数据类型
str
;否则,您可以按照@jezrael的建议,使用
.astype(str)
强制转换它:

# setup
import pandas as pd
df = pd.DataFrame({'TM52_fail':[
    "2", "1", "", "1 & 2", "1 & 2 & 3", "", "", "3"]})

# Use regex \d+ to find 1 or more consecutive digits
df['TM52_fail_norm2'] = df.TM52_fail.str.count('\d+')
时间安排
非常感谢。我认为第二种解决方案可以更快。是的,在较小的数据帧中速度更快,但在较大的数据帧中速度最慢。请参阅我的计时中的更新。但我认为这是一个很好的解决方案。
# setup
import pandas as pd
df = pd.DataFrame({'TM52_fail':[
    "2", "1", "", "1 & 2", "1 & 2 & 3", "", "", "3"]})

# Use regex \d+ to find 1 or more consecutive digits
df['TM52_fail_norm2'] = df.TM52_fail.str.count('\d+')
Regex: 155 µs per loop
 jez1: 999 µs per loop