2016-07-27 3 views
1

데이터 프레임이 있고 목록 뒤에 새로운 열을 많이 만들고 싶고 0으로 채우려면 어떻게해야합니까? 예를 들어팬더 목록 뒤에 많은 열을 어떻게 만들 수 있습니까?

:

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

내가 그것을 어떻게 수행 할 수 있습니다

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

나는

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

나는 나의 새로운 dataframe 원하는 목록의 모습이?

답변

1

를 사용하여 가장 빠른 해결책은 :

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

타이밍 :

[20000 개 행이 X 300 개, 기둥, 트러스, 빔

for col in myList: 
    df[col] = 0 

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

또 다른 해결책은 DataFrame 생성자 concat을 사용하는 것입니다 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를 증가하므로 점진적으로 새로운 열을 추가합니다

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

관련 문제