我正在完成与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'))
添加列后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
此列构造由两个断言测试。第一次通过,第二次通过。
## 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)])
调用列为fips_df.geog_type和fips_df ['geog_type']导致我的第二个断言失败有什么区别?
答案 0 :(得分:3)
以防万一,您可以轻松创建新列。 E.g:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df = pd.DataFrame(np.random.uniform(size=10))
In [4]: df
Out[4]:
0
0 0.366489
1 0.697744
2 0.570066
3 0.756647
4 0.036149
5 0.817588
6 0.884244
7 0.741609
8 0.628303
9 0.642807
In [5]: categorize = lambda value: "ABC"[int(value > 0.3) + int(value > 0.6)]
In [6]: df["new_col"] = df[0].apply(categorize)
In [7]: df
Out[7]:
0 new_col
0 0.366489 B
1 0.697744 C
2 0.570066 B
3 0.756647 C
4 0.036149 A
5 0.817588 C
6 0.884244 C
7 0.741609 C
8 0.628303 C
9 0.642807 C
答案 1 :(得分: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
有趣的是,dot notation for accessing columns中未提及selection syntax。