我有两个问题。首先,我最后填充数据会触发以下错误。其次,由于我不太熟悉“熊猫”,这段代码可能非常不典型。如果您有任何改进,请随时帮助实现这种紧凑和高效。
代码应该在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
答案 0 :(得分:3)
任何带有单个下划线作为名称的第一个字符的东西通常是&#34;私有&#34;在熊猫代码库中真正意味着&#34;可能会发生变化&#34;。因此,您不应该将_ix
用于任何。使用loc
,iloc
,[]
语法或ix
执行分配并选择数据的子集。发生此错误是因为_ix
在您调用ix
之前未实例化(并且其值为None
,直到发生这种情况),但此实现细节与您作为pandas的用户完全无关。使用公共API,您通常不会遇到这些错误。
此外,这一行
result.fillna(NaN)
是无操作,因为默认情况下fillna
会返回一个副本。如果您要更新result
,请执行
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'
专栏'y'
'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}}