2016-07-27 59 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