使用.sum()将列从dataframe转换为float。PythonPandas

2024-05-16 01:52:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧如下:

A   B   C
a   d  '1.1'
a   d  ' 2 '
a   e  '1'
a   e  ' 3 ' 
c   f  '3.2 '

我需要的是将列C中的值求和,同时将它们与A和B分组。但是,这些值是字符串而不是浮点数,有些值有空格,有些没有空格。在

我需要数据帧这样结束:

^{pr2}$

我想做的是:

df.groupby(['A','B']).sum()

然而,由于它们是字符串,它只是将它们合并在一起,而不是实际求和。后来,我试着把它们转换成float,但由于空间的关系,它不允许我使用。最后,我试图删除字符串,但它说它不能操作某些元素,因为它们是int(??)。我猜后者是因为它没有空间。在

注意:为了更好地理解,这些值加上了“+”,但是我需要的结果是3.1、4和3.2

我的显式csv如下:

DL_INSTITUCION,PERIODO_QUE_SE_REPORTA, RESPONSABILIDAD_TOTAL 
Santander,201412,"92,467"
Banca Mifel,201412," 39,089 "
Banca Mifel,201412," 28,286 "
Banca Mifel,201412," 310,902 "
CIBanco,201412," 10,106 "
CIBanco,201412," 46,872 "
Banorte/Ixe,201412," 3,127,120 "
CIBanco,201412," 10,163 "
Santander,201412," 545,027 "
Banca Mifel,201412," 10,291 "
Banca Mifel,201412," 80,738 "
Banca Mifel,201412," 46,329 "
HSBC,201412," 583,274 "
CIBanco,201412," 24,094 "

但是有2800万排。在


Tags: 数据字符串df关系空间floatsum空格
3条回答

编辑:首先替换C列中的逗号

df.C = df.C.str.replace(',', '')
df.C = df.C.astype(np.float)
df.groupby(['A','B']).C.sum().reset_index()

我将最后一行的值改为'1994102'。你得到了

^{pr2}$

根据您的目标:

In [65]: x.groupby(['A','B'])['C'].apply(lambda c: c.str.strip().str.cat(sep='+')).reset_index()
Out[65]:
   A  B      C
0  a  d  1.1+2
1  a  e    1+3
2  c  f    3.2

或者计算总数:

^{pr2}$

简单使用pd.to_numeric
此解决方案的优点是使用pd.to_numeric
这是因为pd.to_numeric如果向pd.Series对象传递了一个pd.Series对象,则返回一个带有索引的pd.Series对象。这为我们提供了方便,可以方便地通过管道将结果发送到groupby。在

pd.to_numeric(df.C).groupby([df.A, df.B]).sum()

A  B
a  d    3.1
   e    4.0
c  f    3.2
Name: C, dtype: float64

errors='coerce'
另外一个好处是,如果我们需要处理不能解析为float的字符串,我们可以使用参数errors='coerce'。这将强制不可解析的字符串np.nan,并且仍然允许有用的聚合。在

^{pr2}$

处理逗号

pd.to_numeric(df.C.str.replace(',', ''), 'coerce').groupby([df.A, df.B]).sum()

设置

df = pd.DataFrame(dict(
        A=list('aaaac'),
        B=list('ddeef'),
        C='1.1| 2 |1| 3 |3.2 '.split('|')
    ))

您可以用pd.read_csv来解决这些问题中的许多

from io import StringIO
import pandas as pd

txt = """DL_INSTITUCION,PERIODO_QUE_SE_REPORTA, RESPONSABILIDAD_TOTAL 
Santander,201412,"92,467"
Banca Mifel,201412," 39,089 "
Banca Mifel,201412," 28,286 "
Banca Mifel,201412," 310,902 "
CIBanco,201412," 10,106 "
CIBanco,201412," 46,872 "
Banorte/Ixe,201412," 3,127,120 "
CIBanco,201412," 10,163 "
Santander,201412," 545,027 "
Banca Mifel,201412," 10,291 "
Banca Mifel,201412," 80,738 "
Banca Mifel,201412," 46,329 "
HSBC,201412," 583,274 "
CIBanco,201412," 24,094 "
"""

df = pd.read_csv(StringIO(txt), skipinitialspace=True, thousands=',')

现在您将注意到dtypes被正确地推断出来了

df.dtypes

DL_INSTITUCION            object
PERIODO_QUE_SE_REPORTA     int64
RESPONSABILIDAD_TOTAL      int64
dtype: object

我们可以毫无争议地进行聚合。在

df.groupby(['DL_INSTITUCION', 'PERIODO_QUE_SE_REPORTA']).sum()

                                       RESPONSABILIDAD_TOTAL 
DL_INSTITUCION PERIODO_QUE_SE_REPORTA                        
Banca Mifel    201412                                  515635
Banorte/Ixe    201412                                 3127120
CIBanco        201412                                   91235
HSBC           201412                                  583274
Santander      201412                                  637494

相关问题 更多 >