Pandas 带np.where()的熊猫柱构造

Pandas 带np.where()的熊猫柱构造,pandas,Pandas,我正在使用Pandas完成一个赋值,并使用np.where()创建一个列,用三个可能的值向Pandas数据框添加一个列: 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

我正在使用Pandas完成一个赋值,并使用np.where()创建一个列,用三个可能的值向Pandas数据框添加一个列:

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']列之间有什么区别导致我的第二次断言失败?

它应该是相同的(并且大多数情况下都是如此)

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


有趣的是,.

中没有提到,以防万一,您可以轻松创建一个新专栏。例如:

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

谢谢@安迪海登。我认为这两种列访问方法都是有效的,尽管我没有看到Pandas文档的这一部分。也许问题来自于断言statement@ajrenold我也是tbh,这是我能想到的唯一方法,值得尝试断言df.A==df['A']?这绝对是进行实际计算的更好方法,注意int不需要:)@AndyHayden true,
int
在调试时潜入。感谢您推荐另一个@MaximYegorushkin!我的新列fips['geog_type']是基于一个数字字符串创建的,其中数字的模式允许分类,但不允许数字值,因此我不确定您的方法是否适用于字符串。我已经编辑了我的问题,并在创建新列后插入了数据框的输出。@ajrenold
categorize
上面的函数接受一个值(列中的任何值)并返回其类别(同样是任何类型,大多数人使用字符串或数字作为类别)。所以您可以修改它以接受字符串。@ajrenold类似于
categorize=lambda值:“country”如果值[-3:]!='000'else('country'如果值='00000'else'state))
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