Python 熊猫:填充空数据帧

Python 熊猫:填充空数据帧,python,pandas,Python,Pandas,我有两个问题。首先,我在最后填充数据会触发以下错误。第二,由于我对“熊猫”不太熟悉,这段代码可能真的很不典型。如果您有任何改进,请随时帮助使其紧凑高效 该代码应该在x到y之间创建一条人行横道。数据库可能多次包含相同的xy关系。然而,它应该是独一无二的。对于每个X,我检查数据库是否正确:如果有多个关系,它们都匹配到同一个y crosswalk.csv的开始: x,y 832,"6231" 0,"00000000" 0,"00000000" 0,"00000000" 0,"00000000" 0,"

我有两个问题。首先,我在最后填充数据会触发以下错误。第二,由于我对“熊猫”不太熟悉,这段代码可能真的很不典型。如果您有任何改进,请随时帮助使其紧凑高效

该代码应该在x到y之间创建一条人行横道。数据库可能多次包含相同的xy关系。然而,它应该是独一无二的。对于每个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行,在
结果._ix[x]=ys[0]
TypeError:“非类型”对象不支持项分配
第1部分 任何名称的第一个字符带有一个下划线的字符通常都是“private”,在pandas代码库中,它的真正含义是“随时可能更改”。所以,你不应该用
\uix
做任何事情。使用
loc
iloc
[]
语法或
ix
执行赋值并选择数据子集。发生此错误的原因是,在调用
ix
之前,
\u ix
不会被实例化(在调用之前,其值为
None
),但作为pandas的用户,此实现细节与您完全无关。使用公共API,通常不会出现此类错误

还有这条线

result.fillna(NaN)
是无操作,因为默认情况下,
fillna
返回一个副本。如果要就地更新
结果
,请执行以下操作

result.fillna(NaN, inplace=True)
该API惯例在整个过程中相当一致。也就是说,对于有意义的方法,函数签名有如下内容

object.method(..., inplace=False)
默认情况下

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

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

  • 'x'
    列分组
  • 给我分组中有多个标签的子集(在
    'x'
    中重复值)
  • groupby我们新的取消单一化
    'x'
  • 告诉我对于
    'x'
  • 如果4。对于任何组,都是
    False
    ,这意味着您重复了x值,其中y值不同

    下面是一个实际的例子(我已经稍微修改了您的原始数据集):

    第一部分 任何名称的第一个字符带有一个下划线的字符通常都是“private”,在pandas代码库中,它的真正含义是“随时可能更改”。所以,你不应该用
    \uix
    做任何事情。使用
    loc
    iloc
    []
    语法或
    ix
    执行赋值并选择数据子集。发生此错误的原因是,在调用
    ix
    之前,
    \u ix
    不会被实例化(在调用之前,其值为
    None
    ),但作为pandas的用户,此实现细节与您完全无关。使用公共API,通常不会出现此类错误

    还有这条线

    result.fillna(NaN)
    
    是无操作,因为默认情况下,
    fillna
    返回一个副本。如果要就地更新
    结果
    ,请执行以下操作

    result.fillna(NaN, inplace=True)
    
    该API惯例在整个过程中相当一致。也就是说,对于有意义的方法,函数签名有如下内容

    object.method(..., inplace=False)
    
    默认情况下

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

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

  • 'x'
    列分组
  • 给我分组中有多个标签的子集(在
    'x'
    中重复值)
  • groupby我们新的取消单一化
    'x'
  • 告诉我对于
    'x'
  • 如果4。对于任何组,都是
    False
    ,这意味着您重复了x值,其中y值不同

    下面是一个实际的例子(我已经稍微修改了您的原始数据集):

    第一部分 任何名称的第一个字符带有一个下划线的字符通常都是“private”,在pandas代码库中,它的真正含义是“随时可能更改”。所以,你不应该用
    \uix
    做任何事情。使用
    loc
    iloc
    []
    语法或
    ix
    执行赋值并选择数据子集。发生此错误的原因是,在调用
    ix
    之前,
    \u ix
    不会被实例化(在调用之前,其值为
    None
    ),但作为pandas的用户,此实现细节与您完全无关。使用公共API,通常不会出现此类错误

    还有这条线

    result.fillna(NaN)
    
    是无操作,因为默认情况下,
    fillna
    返回一个副本。如果要就地更新
    结果
    ,请执行以下操作

    result.fillna(NaN, inplace=True)
    
    该API惯例在整个过程中相当一致。也就是说,对于有意义的方法,函数签名有如下内容

    object.method(..., inplace=False)
    
    默认情况下

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

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

  • 'x'
    列分组
  • 给我分组中有多个标签的子集(在
    'x'
    中重复值)
  • groupby我们新的取消单一化
    'x'
  • 告诉我对于
    'x'
  • 如果4。对于任何组,都是
    False
    ,这意味着您重复了x值,其中y值不同

    下面是一个实际的例子(我已经修改了