用np.where()进行熊猫列构建

ajr*_*old 7 pandas

我正在完成与Pandas的任务,并使用np.where()创建一个包含三个可能值的Pandas DataFrame列:

fips_df['geog_type'] = np.where(fips_df.fips.str[-3:] != '000', 'county', np.where(fips_df.fips.str[:] == '00000', 'country', 'state'))
Run Code Online (Sandbox Code Playgroud)

添加列后DataFrame的状态如下所示:

print fips_df[:5]

    fips         geog_entity fips_prefix geog_type
0  00000       UNITED STATES          00   country
1  01000             ALABAMA          01     state
2  01001  Autauga County, AL          01    county
3  01003  Baldwin County, AL          01    county
4  01005  Barbour County, AL          01    county
Run Code Online (Sandbox Code Playgroud)

这个列结构由两个断言测试.第一次通过,第二次通过.

## check the numbers of geog_type

assert set(fips_df['geog_type'].value_counts().iteritems()) == set([('state', 51), ('country', 1), ('county', 3143)])

assert set(fips_df.geog_type.value_counts().iteritems()) == set([('state', 51), ('country', 1), ('county', 3143)])
Run Code Online (Sandbox Code Playgroud)

调用列为fips_df.geog_type和fips_df ['geog_type']导致我的第二个断言失败有什么区别?

And*_*den 2

应该是相同的(并且大多数时候都是如此)......

一种情况不是这样,当您已经设置了该值的属性或方法时(在这种情况下,它不会被覆盖,因此该列将无法使用点表示法访问):

In [1]: df = pd.DataFrame([[1, 2] ,[3 ,4]])

In [2]: df.A = 7

In [3]: df.B = lambda: 42

In [4]: df.columns = list('AB')

In [5]: df.A
Out[5]: 7

In [6]: df.B()
Out[6]: 42

In [7]: df['A']
Out[7]: 
0    1
1    3
Name: A
Run Code Online (Sandbox Code Playgroud)

有趣的是,选择语法中没有提到用于访问列的点符号