Python 熊猫:填充空数据帧
我有两个问题。首先,我在最后填充数据会触发以下错误。第二,由于我对“熊猫”不太熟悉,这段代码可能真的很不典型。如果您有任何改进,请随时帮助使其紧凑高效 该代码应该在x到y之间创建一条人行横道。数据库可能多次包含相同的xy关系。然而,它应该是独一无二的。对于每个X,我检查数据库是否正确:如果有多个关系,它们都匹配到同一个y crosswalk.csv的开始: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
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'
中重复值)'x'
列'x'
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'
中重复值)'x'
列'x'
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'
中重复值)'x'
列'x'
False
,这意味着您重复了x值,其中y值不同
下面是一个实际的例子(我已经修改了