try / except的问题,尝试在可能的情况下将字符串转换为pandas数据框中的整数

时间:2016-10-19 14:49:34

标签: python pandas try-except

我创建了一个函数来清理数据框中字符串中的任何HTML代码/标记。该函数从数据框中获取每个值,使用remove_html函数清除它,并返回一个干净的df。在将数据帧转换为字符串值并清理它之后,我试图在可能的情况下将数据帧中的值转换回整数。我试过尝试/除了但没有得到我想要的结果。这就是我现在所拥有的:

def clean_df(df):
    df = df.astype(str)
    list_of_columns = list(df.columns)
    for col in list_of_columns:
        column = []
        for row in list(df[col]):
            column.append(remove_html(row))
            try:
                return int(row)
            except ValueError:
                pass

        del df[col]

        df[col] = column

    return df

如果没有try / except语句,函数将返回一个干净的df,其中整数是字符串。所以它只是一个似乎是一个问题的try / except语句。我以多种方式尝试了try / except语句,但没有一个返回df。例如,当前代码返回一个'int'对象。

4 个答案:

答案 0 :(得分:2)

columm.append插入try:

for col in list_of_columns:
    column = []
    for row in list(df[col]):
        try:
            column.append(remove_html(row))
        except ValueError:
            pass

    del df[col]

    df[col] = column

return df

答案 1 :(得分:0)

考虑pd.DataFrame df

df = pd.DataFrame(dict(A=[1, '2', '_', '4']))

enter image description here

您想使用函数pd.to_numeric ...
注意
pd.to_numeric针对标量和pd.Series进行操作。它不在pd.DataFrame上运行 的 另外
使用参数errors='coerce'可以获取尽可能多的数字,并NaN获取其他数据。

pd.to_numeric(df['A'], 'coerce')

0    1.0
1    2.0
2    NaN
3    4.0
Name: A, dtype: float6

或者,为了获得尽可能多的数字,以及你在其他地方已有的数据

pd.to_numeric(df['A'], 'coerce').combine_first(df['A'])

0    1
1    2
2    _
3    4
Name: A, dtype: object

然后您可以将其分配回df

df['A'] = pd.to_numeric(df['A'], 'coerce').combine_first(df['A'])

答案 2 :(得分:0)

像这样工作:

def clean_df(df):
df = df.astype(str)
list_of_columns = list(df.columns)
for col in list_of_columns:
    column = []
    for row in list(df[col]):
        try:
            column.append(int(remove_html(row)))
        except ValueError:
            column.append(remove_html(row))

    del df[col]

    df[col] = column

return df

答案 3 :(得分:0)

在函数中使用try / except,并将该函数与DataFrame.applymap()

一起使用
df = pd.DataFrame([['a','b','1'],
                   ['2','c','d'],
                   ['e','3','f']])
def foo(thing):
    try:
        return int(thing)
    except ValueError as e:
        return thing

>>> df[0][2]
'e'
>>> df[0][1]
'2'
>>> df = df.applymap(foo)
>>> df[0][2]
'e'
>>> df[0][1]
2
>>>