Python:应用于分隔的值

Python:应用于分隔的值,python,pandas,dataframe,Python,Pandas,Dataframe,如何对用分号分隔的数据帧中的值求和 得到: 需要: 您可以使用: df['col2'] = df.col2.map(lambda s: sum(float(e) for e in s.split(';'))) 对于每列,您可以使用以下方法对每列进行处理:转换为float和sum: df = df.apply(lambda x: x.str.split(';', expand=True).astype(float).sum(axis=1)) 或通过以下方式分别处理每个值: 编辑: 如果可以使用

如何对用分号分隔的数据帧中的值求和

得到:

需要:

您可以使用:

df['col2'] = df.col2.map(lambda s: sum(float(e) for e in s.split(';')))
对于每列,您可以使用以下方法对每列进行处理:转换为
float
sum

df = df.apply(lambda x: x.str.split(';', expand=True).astype(float).sum(axis=1))
或通过以下方式分别处理每个值:

编辑:

如果可以使用带字符串的数字列来排除数字,并且只能使用带
字符串的
s列

print (df)
           col1   col2  col3
2018-03-05  2.1      8     1
2018-03-06    8  3.1;2     2
2018-03-07  1;1    8;1     8

cols = df.select_dtypes(exclude=np.number).columns
df[cols] = df[cols].apply(lambda x: x.str.split(';', expand=True).astype(float).sum(axis=1))
print (df)
            col1  col2  col3
2018-03-05   2.1   8.0     1
2018-03-06   8.0   5.1     2
2018-03-07   2.0   9.0     8

如果性能有问题,可以使用
numpy.vectorize

res = pd.DataFrame(np.vectorize(lambda x: sum(map(float, x.split(';'))))(df.values),
                   columns=df.columns, index=df.index)
绩效基准测试

def jpp(df):
    res = pd.DataFrame(np.vectorize(lambda x: sum(map(float, x.split(';'))))(df.values),
                       columns=df.columns, index=df.index)
    return res

def jez(df):
    return df.applymap(lambda x: sum(map(float, x.split(';'))))

df = pd.concat([df]*1000)

%timeit jpp(df)  # 11 ms per loop
%timeit jez(df)  # 21.3 ms per loop

您的解决方案不会对
col1
的值求和,谢谢!但是对于第一个解决方案,我接收所有不带分号的值的
Nan
。对于第二个
AttributeError:(“'int'对象没有属性'split'”。
@VadimK-最简单的是
df=df.astype(str).apply(lambda x:x.str.split(';',expand=True).astype(float.sum(axis=1))
print (df)
           col1   col2  col3
2018-03-05  2.1      8     1
2018-03-06    8  3.1;2     2
2018-03-07  1;1    8;1     8

cols = df.select_dtypes(exclude=np.number).columns
df[cols] = df[cols].apply(lambda x: x.str.split(';', expand=True).astype(float).sum(axis=1))
print (df)
            col1  col2  col3
2018-03-05   2.1   8.0     1
2018-03-06   8.0   5.1     2
2018-03-07   2.0   9.0     8
res = pd.DataFrame(np.vectorize(lambda x: sum(map(float, x.split(';'))))(df.values),
                   columns=df.columns, index=df.index)
def jpp(df):
    res = pd.DataFrame(np.vectorize(lambda x: sum(map(float, x.split(';'))))(df.values),
                       columns=df.columns, index=df.index)
    return res

def jez(df):
    return df.applymap(lambda x: sum(map(float, x.split(';'))))

df = pd.concat([df]*1000)

%timeit jpp(df)  # 11 ms per loop
%timeit jez(df)  # 21.3 ms per loop