如何对以分号分隔的数据框中的值进行求和?
GOT:
col1 col2
2018-03-05 2.1 8
2018-03-06 8 3.1;2
2018-03-07 1;1 8;1
需要:
col1 col2
2018-03-05 2.1 8
2018-03-06 8 5.1
2018-03-07 2 9
答案 0 :(得分:1)
您可以apply
使用split
处理每个列的流程,每列投放到float
和sum
:
df = df.apply(lambda x: x.str.split(';', expand=True).astype(float).sum(axis=1))
或按applymap
分别处理每个值:
df = df.applymap(lambda x: sum(map(float, x.split(';'))))
print (df)
col1 col2
2018-03-05 2.1 8.0
2018-03-06 8.0 5.1
2018-03-07 2.0 9.0
编辑:
如果数字包含字符串列,则可以使用select_dtypes
排除数字,仅使用string
;
的{{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
答案 1 :(得分:1)
如果性能问题,您可以使用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
效果基准
<ion-input [(ngModel)]="username" name="username" type="text" #username="ngModel" spellcheck="false" autocapitalize="off" autofocus clearInput required #focusInput></ion-input>
答案 2 :(得分:0)
您可以使用:
df['col2'] = df.col2.map(lambda s: sum(float(e) for e in s.split(';')))