有条件地使用自己的值更新数据框值

时间:2019-06-25 08:35:50

标签: python pandas

我有带有浮动街道编号的DF,有时是“ NaN”或“ x-y”(例如:30-32),但经常是x.y(例如:32.0而不是30) 我需要将其更改为int(当然,如果课程号中没有“-”)。 我已经尝试过

chunk.loc["-" not in chunk["Street Number"] & chunk["Street Number"].notna(), 'Street Number'] = chunk["Street Number"].astype(int)

我知道在我的“ =”符号后出现问题。请问如何有条件地用自己的值更新数据框值? 我也尝试过

chunk[["Street Number"]].astype(int)

没有错误

  

DF的样本:

     

0 | NaN

     

1 | 1.0

     

2 | 6.0

     

3 | 170.0

     

4 | 61.0

     

5 | 51-52

我尝试强制使用dtype“街道编号”:np.uint16,但出现ValueError:Integer列在第12列中具有NA值

2 个答案:

答案 0 :(得分:1)

使用更改后的Cedric H. solution,但输出中是混合的字符串,整数,浮点数(NaN):

def convert_street_number_values(x):
    try:
        x = float(x)
        if x.is_integer():
            return int(x)
        else:
            return x
    except Exception:
        return x

chunk = pd.DataFrame({'Street Number':[np.nan, '1.0', '6.0', '170.0', '61.0', '51-52']})

chunk['Street Number'] = chunk['Street Number'].apply(convert_street_number_values)
print (chunk)
  Street Number
0           NaN
1             1
2             6
3           170
4            61
5         51-52

编辑:

问题是,如果有多个不同的组-熊猫会将列转换为整数,但是如果至少有一个NaN的值,它将转换回floats

适用于所有数据的解决方案正在转换为strings

def convert_street_number_values(x):
    try:
        x = float(x)
        if x.is_integer():
            return str(int(x))
        else:
            return str(x)
    except Exception:
        return str(x)

因为可以使用Nullable Integer Data Type转换为缺少值的整数:

chunk['Street Number'] = chunk['Street Number'].astype('Int64')

,但如果至少为字符串值,则失败。

因此,如果将所有非数字都转换为NaN,则可以正常工作:

chunk['Street Number'] = pd.to_numeric(chunk['Street Number'], errors='coerce').astype('Int64')

答案 1 :(得分:0)

我会做这样的事情:

def convert_street_number_values(v):
    # Add more complex 'rules' as you need
    try:
        return int(v)
    except Exception:
        return v

df['Steet Number'].apply(convert_street_number_values)