熊猫:填空数据框

时间:2014-04-18 14:22:16

标签: python pandas

我有两个问题。首先,我最后填充数据会触发以下错误。其次,由于我不太熟悉“熊猫”,这段代码可能非常不典型。如果您有任何改进,请随时帮助实现这种紧凑和高效。

代码应该在x到y之间创建一个人行横道。数据库可以多次包含相同的x-y关系。但是,它应该是独一无二的。对于每个X,我检查数据库是否实际上是正确的:如果有多个关系,它们都匹配相同的y。

crosswalk.csv的开头:

x,y
832,"6231"
0,"00000000"
0,"00000000"
0,"00000000"
0,"00000000"
0,"00000000"
0,"00000000"
840,"6214"
842,"6111"

代码

data = pd.read_csv('data/crosswalk_short.csv')
df = pd.DataFrame(data)

xs = df.x.unique()
result = pd.DataFrame(index=xs)
result.fillna(NaN)

for x in xs:
    ys = df[df.x == x].y
    range = arange(0, len(ys.index))
    ys = ys.reindex(range)

    if (range[-1] > 0 and not isnan(ys[1]) ):
        print 'error!'

    result._ix[x] = ys[0]

错误:

  File "<ipython-input-129-4cf0c04508c4>", line 1, in <module>
    result._ix[x] = ys[0]
TypeError: 'NoneType' object does not support item assignment

1 个答案:

答案 0 :(得分:3)

第1部分

任何带有单个下划线作为名称的第一个字符的东西通常是&#34;私有&#34;在熊猫代码库中真正意味着&#34;可能会发生变化&#34;。因此,您不应该将_ix用于任何。使用lociloc[]语法或ix执行分配并选择数据的子集。发生此错误是因为_ix在您调用ix之前未实例化(并且其值为None,直到发生这种情况),但此实现细节与您作为pandas的用户完全无关。使用公共API,您通常不会遇到这些错误。

此外,这一行

result.fillna(NaN)

是无操作,因为默认情况下fillna会返回一个副本。如果您要更新result,请执行

result.fillna(NaN, inplace=True)

此API约定在整个熊猫中相当一致。也就是说,对于有意义的方法,函数签名具有类似

的方法
object.method(..., inplace=False)

默认情况下。

第2部分

关于您的第二个问题,您似乎想要检查所有重复的xs是否具有相同的y值。一种方法是:

df.groupby('x').filter(lambda x: x.count() > 1).groupby('x').y.nunique() == 1

这说:

  1. groupby 'x'
  2. 给我子组,其中组中的标签不止一个('x'中的重复值)
  3. groupby by new de-single-fied 'x'专栏
  4. 告诉我'y'
  5. 中的每个值是否只有一个唯一'x'False

    如果4.对于任何组都是In [94]: df = pd.read_csv(StringIO('''x,y q832,"6231" 1,"00000000" 1,"00000001" 0,"00000000" 0,"00000000" 0,"00000000" 0,"00000000" 840,"6214" 840,"6111"''')) In [95]: df.groupby('x').filter(lambda x: x.count() > 1).groupby('x').y.nunique() == 1 Out[95]: x 0 True 1 False 840 False dtype: bool ,则表示您重复了x值,其中y值不同。

    以下是此操作的示例(我已经稍微修改了您的原始数据集):

    {{1}}