求一列值的和,包括Python中的字母

求一列值的和,包括Python中的字母,python,csv,pandas,dataframe,Python,Csv,Pandas,Dataframe,我有一个输入CSV文件,需要在其中一列中添加所有值,但这些值不是纯整数,我不知道如何操作 总输出应该在15k左右,这是整个列的总和。我使用熊猫数据框来存储.csv文件 以下是我的input.csv文件中的一列: 我想你需要先把K移走,然后施放到漂浮处,最后: 然后可以乘以1000: 如果需要添加K: 按注释编辑: 如果需要以K表示的输出: 如果需要输出为数字: df['DAMAGE_PROPERTY'] = df.DAMAGE_PROPERTY.str.replace(r'[KM]','').a

我有一个输入CSV文件,需要在其中一列中添加所有值,但这些值不是纯整数,我不知道如何操作

总输出应该在15k左右,这是整个列的总和。我使用熊猫数据框来存储.csv文件

以下是我的input.csv文件中的一列:


我想你需要先把K移走,然后施放到漂浮处,最后:

然后可以乘以1000:

如果需要添加K:

按注释编辑:

如果需要以K表示的输出:

如果需要输出为数字:

df['DAMAGE_PROPERTY'] = df.DAMAGE_PROPERTY.str.replace(r'[KM]','').astype(float)
df['DAMAGE_PROPERTY'] = df.DAMAGE_PROPERTY.mask(mask, df.DAMAGE_PROPERTY*1000) * 1000
print (df)
   DAMAGE_PROPERTY
0           2500.0
1           2500.0
2       25000000.0

print (df['DAMAGE_PROPERTY'].sum())
25005000.0
编辑1:

如果存在带B的值:


我想你需要先把K移走,然后施放到漂浮处,最后:

然后可以乘以1000:

如果需要添加K:

按注释编辑:

如果需要以K表示的输出:

如果需要输出为数字:

df['DAMAGE_PROPERTY'] = df.DAMAGE_PROPERTY.str.replace(r'[KM]','').astype(float)
df['DAMAGE_PROPERTY'] = df.DAMAGE_PROPERTY.mask(mask, df.DAMAGE_PROPERTY*1000) * 1000
print (df)
   DAMAGE_PROPERTY
0           2500.0
1           2500.0
2       25000000.0

print (df['DAMAGE_PROPERTY'].sum())
25005000.0
编辑1:

如果存在带B的值:


我不熟悉pandas/dataframe,但可以使用简单的Python逻辑。假设您的文件遵循的K模式为每行中的最后一个字符,请考虑以下内容:

>>> float("2.0K"[:-1])
2.0
>>> float("2.0M"[:-1])
2.0
您可以在每行上使用上面的位。例如:

# assuming you've read the contents into a list called "lines"
values = []
for s in lines:
    try:
        values.append(float(s[:-1])))
    except ValueError:
        # found something else; log it or something
        pass
最后,您只需将它们与Python的内置求和函数一起添加:

total = sum(values)

我不熟悉pandas/dataframe,但可以使用简单的Python逻辑。假设您的文件遵循的K模式为每行中的最后一个字符,请考虑以下内容:

>>> float("2.0K"[:-1])
2.0
>>> float("2.0M"[:-1])
2.0
您可以在每行上使用上面的位。例如:

# assuming you've read the contents into a list called "lines"
values = []
for s in lines:
    try:
        values.append(float(s[:-1])))
    except ValueError:
        # found something else; log it or something
        pass
最后,您只需将它们与Python的内置求和函数一起添加:

total = sum(values)
试试这个:

按照这个模式,你可以增加数十亿的B。对于没有K或M的值,什么也不做

def chgFormat(x):
        newFormat = 0
        if   x[-1] == 'K': newFormat = float(x[:-1])
        elif x[-1] == 'H': newFormat = float(x[:-1])/10    
        elif x[-1] == 'M': newFormat = float(x[:-1])*1000
        elif x[-1] == 'B': newFormat = float(x[:-1])*1000000    
        return newFormat

print str(sum(df['DAMAGE_PROPERTY'].dropna().apply(chgFormat)))+'K'
print str(sum(df['DAMAGE_PROPERTY'].dropna().apply(chgFormat))/1000)+'M''

Results:
401.0K
0.401M
使用此选项:如果存在NAN:

    print str(sum(df3['DAMAGE_PROPERTY'].dropna().apply(chgFormat)))+'K'
    print str(sum(df3['DAMAGE_PROPERTY'].dropna().apply(chgFormat))/1000)+'M'
编辑3:

    print sum(df3['DAMAGE_PROPERTY'].dropna().apply(chgFormat))
试试这个:

按照这个模式,你可以增加数十亿的B。对于没有K或M的值,什么也不做

def chgFormat(x):
        newFormat = 0
        if   x[-1] == 'K': newFormat = float(x[:-1])
        elif x[-1] == 'H': newFormat = float(x[:-1])/10    
        elif x[-1] == 'M': newFormat = float(x[:-1])*1000
        elif x[-1] == 'B': newFormat = float(x[:-1])*1000000    
        return newFormat

print str(sum(df['DAMAGE_PROPERTY'].dropna().apply(chgFormat)))+'K'
print str(sum(df['DAMAGE_PROPERTY'].dropna().apply(chgFormat))/1000)+'M''

Results:
401.0K
0.401M
使用此选项:如果存在NAN:

    print str(sum(df3['DAMAGE_PROPERTY'].dropna().apply(chgFormat)))+'K'
    print str(sum(df3['DAMAGE_PROPERTY'].dropna().apply(chgFormat))/1000)+'M'
编辑3:

    print sum(df3['DAMAGE_PROPERTY'].dropna().apply(chgFormat))

我将编写以下函数:

import re

mapper = dict(k=1e3, K=1e3,
              m=1e6, M=1e6,
              b=1e9, B=1e9)
pot = ('K', 'M', 'B')

def revmap(value):
    powers_of_K = int(np.log10(value) // 3)
    if powers_of_K > len(pot): 
        suffix = pot[-1]
    else:
        suffix = pot[powers_of_K - 1]

    k = mapper[suffix]
    f = ("%f" % (value / k)).rstrip('0').rstrip('.')
    return f + suffix

def sum_with_units(s):
    regex = r'(?P<value>.*)(?P<unit>k|m)'
    s_ = s.str.extract(regex, expand=True, flags=re.IGNORECASE)
    summed = (s_.value.astype(float) * s_.unit.map(mapper)).sum()
    return revmap(summed)

sum_with_units(df.DAMAGE_PROPERTY)

'401K'

我将编写以下函数:

import re

mapper = dict(k=1e3, K=1e3,
              m=1e6, M=1e6,
              b=1e9, B=1e9)
pot = ('K', 'M', 'B')

def revmap(value):
    powers_of_K = int(np.log10(value) // 3)
    if powers_of_K > len(pot): 
        suffix = pot[-1]
    else:
        suffix = pot[powers_of_K - 1]

    k = mapper[suffix]
    f = ("%f" % (value / k)).rstrip('0').rstrip('.')
    return f + suffix

def sum_with_units(s):
    regex = r'(?P<value>.*)(?P<unit>k|m)'
    s_ = s.str.extract(regex, expand=True, flags=re.IGNORECASE)
    summed = (s_.value.astype(float) * s_.unit.map(mapper)).sum()
    return revmap(summed)

sum_with_units(df.DAMAGE_PROPERTY)

'401K'


很抱歉,我错过了,还有一些条目,如340万3千4百万,我也想添加它们。所以现在的情况是有3K和3.4M这样的混合条目,我想添加它们。@chinmaykelkar:见更新的帖子。如果您使用float2.0K[:-1],那么末尾是否有K或M或其他值并不重要。您可以在字符串中使用列表表示法/切片,这只是剪切最后一个字符。@chinmaykelkar:啊,我没注意到您想添加尾随字母。我以为你想避开它们。很抱歉,我错过了一些条目,比如340万,我也想添加它们。所以现在的情况是有3K和3.4M这样的混合条目,我想添加它们。@chinmaykelkar:见更新的帖子。如果您使用float2.0K[:-1],那么末尾是否有K或M或其他值并不重要。您可以在字符串中使用列表表示法/切片,这只是剪切最后一个字符。@chinmaykelkar:啊,我没注意到您想添加尾随字母。我以为你想避开它们。很抱歉,我错过了一些条目,比如340万,我也想添加它们。现在的情况是,有3K和3.4M这样的混合条目,我想添加它们。我最初错过了OP想要保留字母的部分,而不是将它们切掉。你得到我的+1.Ahh。我还发现了一些类似6B的条目。很抱歉,这是一个非常大的文件,所以我丢失了一些条目。您的代码正在为我处理K和M条目。你能告诉我B项目我应该怎么做吗?我想我们需要将所有条目转换为数十亿或数千。你说什么?是的,你需要另一个面具。请稍等。我收到的错误为ValueError:无法将字符串转换为float:。这是因为某个空条目吗?对不起,我错过了一些条目,比如340万,我也想添加它们。现在的情况是,有3K和3.4M这样的混合条目,我想添加它们。我最初错过了OP想要保留字母的部分,而不是将它们切掉。你得到我的+1.Ahh。我还发现了一些类似6B的条目。很抱歉,这是一个非常大的文件,所以我丢失了一些条目。您的代码正在为我处理K和M条目。你能告诉我B项目我应该怎么做吗?我想我们需要将所有条目转换为数十亿或数千。你说什么?是的,你需要另一个面具。请稍等。我收到的错误为ValueError:无法将字符串转换为float:。这是因为某个空条目吗?请指导我应该为NaN值做什么?再次编辑,如果你看到模式,现在只是一个数学问题。这是基于使用K,M或B。或者hy。你的代码对我很好。但问题是我将“损坏财产”的数据类型作为对象。因此,我无法执行类似于DAMAGE\u PROPERTY>=0的查询,因为DAMAGE\u属性属于对象类型。但我想要浮式的。我试过使用.astypesfloat但是
它不起作用。如果你有解决办法,请告诉我。是的,有解决办法401.0K“是一个对象。”401.0'是一个浮动。不要做str或+K,你有浮动。您应该学习一个基本python编码的python教程。如果这是您正在使用的解决方案,您应该将此答案标记为正确。在应用您编写的函数后,是否可以检查df3['DAMAGE_PROPERTY]的数据类型?它仍然向您显示对象吗?我应该为NaN值做什么?再次编辑,如果您看到该模式,它现在只是一个数学问题。这是基于使用K,M或B。或者hy。你的代码对我很好。但问题是我将“损坏财产”的数据类型作为对象。因此,我无法执行类似于DAMAGE\u PROPERTY>=0的查询,因为DAMAGE\u属性属于对象类型。但我想要浮式的。我试过使用.astypesfloat,但不起作用。如果你有解决办法,请告诉我。是的,有解决办法401.0K“是一个对象。”401.0'是一个浮动。不要做str或+K,你有浮动。您应该学习一个基本python编码的python教程。如果这是您正在使用的解决方案,您应该将此答案标记为正确。在应用您编写的函数后,是否可以检查df3['DAMAGE_PROPERTY]的数据类型?它还在向你展示这个物体吗?