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