转换数据框列时如何删除千位逗号分隔符? [复制]

Posted

技术标签:

【中文标题】转换数据框列时如何删除千位逗号分隔符? [复制]【英文标题】:How can I remove the thousand comma separator when converting data frame columns? [duplicate] 【发布时间】:2020-05-13 23:47:50 【问题描述】:

给定以下数据框:

State,City,Population,Poverty_Rate,Median_Age, 
VA,XYZ,.,10.5%,42, 
MD,ABC,"12,345",8.9%,., 
NY,.,987,654,.,41, 
...

import pandas as pd
df = pd.read_csv("/path... /sample_data")

df.dtypes 返回

State          Object
City           Object
Population     Object
Proverty_Rate  Object
Median_Age     Object

我尝试将相应列的数据类型转换为 int 或 float:

df = df.astype("Population": int, "Proverty_rate": float, "Median_Age": int )

我收到了

Value Error: invalid literal for int() with base 10: '12,345'

我怀疑逗号分隔符导致了这个问题。如何从我的数据集中删除它们?

【问题讨论】:

是的,当您在 csv 中读取时,使用 thousands 参数。 pd.read_csv('file.csv', thousands=',') 【参考方案1】:

Pandas DataFrame 中有一个参数为 pd.read_csv(thousands=','),默认设置为 None。

data = """
State   City    Population Poverty_Rate  Median_Age
VA      XYZ     500,00          10.5%         42
MD      ABC     12,345      8.9%          .
NY      .       987,654     .             41"""

from io import StringIO
import pandas as pd

df = pd.read_csv(StringIO(data),sep='\s+',thousands=',')

print(df)

  State City  Population Poverty_Rate Median_Age
0    VA  XYZ       50000        10.5%         42
1    MD  ABC       12345         8.9%          .
2    NY    .      987654            .         41

理想情况下,您需要做的是替换字符串标记,然后将字符串列强制转换为整数/浮点数。

#using your dict.
int_cols = ("Population": int, "Poverty_Rate": float, "Median_Age": int )

for col in int_cols.keys():
    df[col] = pd.to_numeric(df[col].astype(str).str.replace('%',''),errors='coerce')

print(df.dtypes)

State            object
City             object
Population        int64
Poverty_Rate    float64
Median_Age      float64
dtype: object


print(df)

  State City  Population  Poverty_Rate  Median_Age
0    VA  XYZ       50000          10.5        42.0
1    MD  ABC       12345           8.9         NaN
2    NY    .      987654           NaN        41.0

【讨论】:

谢谢。我应该包括 .csv 文件本身是逗号分隔的,并且大数字存储为 ..., "1,234", ...【参考方案2】:

您可以尝试以下方法吗?在将其强制转换为整数之前先在列上执行str.replace

import pandas as pd

df = pd.DataFrame([
    'value': '123,445',
    'value': '143,445,788'
])
df['value'] = df['value'].str.replace(',', '').astype(int)

【讨论】:

请试试这个。这应该去掉所有逗号和不需要的点,包括Poverty_Rate 列中的点 m=df['Poverty_Rate'].str.contains('%') df.loc[:, df.columns != ' Poverty_Rate']=df.loc[:, df.columns != 'Poverty_Rate'].apply(lambda x: x.str.replace('[\,\.]','')) df.loc[~m , 'Poverty_Rate']=df.loc[~m, 'Poverty_Rate'].str.replace('[\.]','') df

以上是关于转换数据框列时如何删除千位逗号分隔符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将整列整数转换为字符串,在 Pandas 中使用逗号分隔千位

从 pandas 数据框列中的对象中删除逗号

使用千位逗号分隔符格式化 DataGridViewColumn

导入包含逗号、千位分隔符和尾随减号的 CSV 数据

删除逗号,它是 R 中的千位分隔符

当某些数字包含逗号作为千位分隔符时如何读取数据?