Python pandas:适用于分离的值

时间:2018-05-18 10:37:13

标签: python pandas dataframe

如何对以分号分隔的数据框中的值进行求和?

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

3 个答案:

答案 0 :(得分:1)

您可以apply使用split处理每个列的流程,每列投放到floatsum

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(';')))