2016-07-27 64 views
1

我有一个数据框,我想在列表后面创建很多新列,并填入0,我该怎么做?如何在熊猫列表中创建许多列?

例如:

df = pd.DataFrame({"a":["computer", "printer"]}) 
print(df) 
>>>   a 
>>>0 computer 
>>>1 printer 

我有一个列表

myList=["b","c","d"] 

我想我的新数据框的样子:

>>>   a b c d 
>>>0 computer 0 0 0 
>>>1 printer 0 0 0 

我该怎么办呢?

回答

1

用最快的解决方案:

for col in myList: 
    df[col] = 0 

print(df) 
      a b c d 
0 computer 0 0 0 
1 printer 0 0 0 

另一种解决方案是使用concatDataFrame构造:

pd.concat([df3,pd.DataFrame(columns=myList, index=df.index, data=0)], axis=1) 

时序

[20000行×300个colu MNS]

In [286]: %timeit pd.concat([df,pd.DataFrame(columns=myList)], axis=1).fillna(0) 
1 loop, best of 3: 1.17 s per loop 

In [287]: %timeit pd.concat([df3,pd.DataFrame(columns=myList, index=df.index,data=0)],axis=1) 
10 loops, best of 3: 81.7 ms per loop 

In [288]: %timeit (orig(df4)) 
10 loops, best of 3: 59.2 ms per loop 

代码计时:

myList=["b","c","d"] * 100 
df = pd.DataFrame({"a":["computer", "printer"]}) 
print(df) 
df = pd.concat([df]*10000).reset_index(drop=True) 
df3 = df.copy() 
df4 = df.copy() 

df1= pd.concat([df,pd.DataFrame(columns=myList)], axis=1).fillna(0) 

df2 = pd.concat([df3,pd.DataFrame(columns=myList, index=df.index, data=0)], axis=1) 

print(df1) 
print(df2) 

def orig(df): 
    for col in range(300): 
     df[col] = 0 
    return df 

print (orig(df4)) 
1

这将是更好的性能,以concat大型DFS空DF,而不是逐步添加新列,因为这将增加对DF递增,而而不仅仅是最终的DF尺寸的单一分配:

In [116]: 
myList=["b","c","d"] 
df = pd.concat([df,pd.DataFrame(columns=myList)], axis=1).fillna(0) 
df 

Out[116]: 
      a b c d 
0 computer 0 0 0 
1 printer 0 0 0 
+0

嗯,我认为'concat'解决方案更快,但不是。很有意思。 – jezrael

+0

@jezrael也是令人惊讶的,我期望在这里逐渐增加df,使其不具有高性能 – EdChum