2017-02-27 50 views
2

我看不到我的问题在哪里,这段代码对于一个非常简单的例子工作正常,但是当我开始使用我的真实数据时,我遇到了问题。为什么我的熊猫数据框变成'None'类型?

我基本上是从各种csv文件中提取某些数据,并试图最终将它们合并到一个数据框中。

相关部分的代码如下:

wavenames = ['W1_', 'W2_', 'W3_'] 
logs=['log1','log2','log3','log4'] 

for w in wavenames: 
    AllSynt = pd.DataFrame(index=range(6341), columns=['X']+logs) 
    AllSynt['X']=z # an array extracted from elsewhere 
    print AllSynt.head(3) 
    for f in files: 
     for l in logs: 
      if (f.startswith('Synthetic_'+w)) & (f.endswith(l+'.csv')): 
       df = pd.read_csv(path+f,delimiter=',') 
       AllSynt = pd.DataFrame(AllSynt) 
       AllSynt = AllSynt.merge(df,how='left',on='X') 
       AllSynt = AllSynt.rename(columns = {'Y':l}, inplace = True) 
    print '\n', AllSynt.head(5) 

,但是这给了我AttributeError: 'NoneType' object has no attribute 'head' (确保该AllSynt是在循环开始时的熊猫数据帧之前,我得到了同样的错误(刚。说它有没有属性“合并”)为什么我的AllSynt数据框永久地变成一个None

+2

当您在'rename'操作期间提供'inplace = True'时,不需要将结果重新分配给变量。这就是为什么,这些返回值为“无”值。 –

+0

谢谢,这有些帮助(所有的值都是'NaN',但至少它是一个数据框)。但是我仍然怀疑 - 正如问题中提到的那样,在重命名过程之前的循环开始处已经出现了“无”值。那是为什么? – durbachit

+1

这是因为你已经填充了它的柱面名称,而只用预定义数组填充对应于'X'的值。 'logs'中的元素(*构成列名*)在它们下面没有任何值,所以它们自然被'NaN''填充。 –

回答

1

你需要重写行:

AllSynt = AllSynt.rename(columns={'Y':l}, inplace=True)

简单以下几点:

AllSynt.rename(columns={'Y':l}, inplace=True) # No assigning with inplace parameter 
# (or) 
AllSynt = AllSynt.rename(columns={'Y':l}  # assign without inplace parameter 

当您指定inplace=True,并希望看到它的内容,它会返回None,因为他们仅仅是变异的DF,而不是创建它的一个新的副本。基本上,你分配None的结果,因此它抱怨AttributeError,因为它不是pd.DataFrame对象了访问它的.head()方法。

相似的类比可以通过在纯Python做list.append()list.sort()等操作,而其分配结果在同一行的变量,这也出于同样的原因返回None,因为它们在默认情况下操作inplace观察。