팬더가 완전히 채워지도록 설계 DataFrame
되었지만 빈 DataFrame을 만든 다음 행을 하나씩 추가 해야합니다 . 가장 좋은 방법은 무엇입니까?
빈 데이터 프레임을 성공적으로 만들었습니다.
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
그런 다음 새 행을 추가하고 필드를 다음과 같이 채울 수 있습니다.
res = res.set_value(len(res), 'qty1', 10.0)
작동하지만 매우 이상해 보입니다 :-/ (문자열 값을 추가하지 못했습니다)
다른 열 유형으로 내 DataFrame에 새 행을 추가하려면 어떻게합니까?
답변
>>> import pandas as pd
>>> from numpy.random import randint
>>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2'])
>>> for i in range(5):
>>> df.loc[i] = ['name' + str(i)] + list(randint(10, size=2))
>>> df
lib qty1 qty2
0 name0 3 3
1 name1 2 4
2 name2 2 8
3 name3 2 1
4 name4 9 6
답변
데이터 프레임에 대한 모든 데이터를 미리 가져올 수있는 경우 데이터 프레임에 추가하는 것보다 훨씬 빠른 방법이 있습니다.
- 각 사전이 입력 데이터 행에 해당하는 사전 목록을 작성하십시오.
- 이 목록에서 데이터 프레임을 작성하십시오.
행 단위로 데이터 프레임을 추가하는 데 30 분이 걸리는 비슷한 작업이 있었고 몇 초 안에 완료 된 사전 목록에서 데이터 프레임을 작성했습니다.
rows_list = []
for row in input_rows:
dict1 = {}
# get input row in dictionary format
# key = col_name
dict1.update(blah..)
rows_list.append(dict1)
df = pd.DataFrame(rows_list)
답변
당신은 사용할 수 있습니다 pandas.concat()
또는 DataFrame.append()
. 세부 사항 및 예제는 병합, 결합 및 연결을 참조하십시오 .
답변
오랜 시간이 지났지 만 같은 문제에 직면했습니다. 그리고 여기에 흥미로운 답변이 많이 있습니다. 그래서 어떤 방법을 사용 해야할지 혼란 스러웠습니다.
데이터 프레임에 많은 행을 추가하는 경우 속도 성능에 관심 이 있습니다. 그래서 가장 인기있는 4 가지 방법을 시도하고 속도를 확인했습니다.
새 버전의 패키지를 사용하여 2019 년에 업데이트되었습니다 . @FooBar 주석 후에도 업데이트 됨
속도 성능
- .append 사용하기 ( NPE ‘s answer )
- .loc 사용하기 ( fred ‘s answer )
- 사전 할당과 함께 .loc 사용하기 ( FooBar ‘s answer )
- dict을 사용하고 결국 DataFrame을 생성하십시오 ( ShikharDua ‘s answer )
결과 (초) :
|------------|-------------|-------------|-------------|
| Approach | 1000 rows | 5000 rows | 10 000 rows |
|------------|-------------|-------------|-------------|
| .append | 0.69 | 3.39 | 6.78 |
|------------|-------------|-------------|-------------|
| .loc w/o | 0.74 | 3.90 | 8.35 |
| prealloc | | | |
|------------|-------------|-------------|-------------|
| .loc with | 0.24 | 2.58 | 8.70 |
| prealloc | | | |
|------------|-------------|-------------|-------------|
| dict | 0.012 | 0.046 | 0.084 |
|------------|-------------|-------------|-------------|
유용한 의견 을 주신 @krassowski 덕분에 -코드를 업데이트했습니다.
그래서 나는 사전을 통해 덧셈을 사용합니다.
암호:
import pandas as pd
import numpy as np
import time
del df1, df2, df3, df4
numOfRows = 1000
# append
startTime = time.perf_counter()
df1 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows-4):
df1 = df1.append( dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']), ignore_index=True)
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df1.shape)
# .loc w/o prealloc
startTime = time.perf_counter()
df2 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
df2.loc[i] = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df2.shape)
# .loc with prealloc
df3 = pd.DataFrame(index=np.arange(0, numOfRows), columns=['A', 'B', 'C', 'D', 'E'] )
startTime = time.perf_counter()
for i in range( 1,numOfRows):
df3.loc[i] = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df3.shape)
# dict
startTime = time.perf_counter()
row_list = []
for i in range (0,5):
row_list.append(dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']))
for i in range( 1,numOfRows-4):
dict1 = dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E'])
row_list.append(dict1)
df4 = pd.DataFrame(row_list, columns=['A','B','C','D','E'])
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df4.shape)
추신 : 나는 내 실현이 완벽하지 않으며 아마도 최적화가 있다고 생각합니다.
답변
사전에 입력 한 항목 수를 알고 있으면 인덱스를 제공하여 공간을 미리 할당해야합니다 (다른 답변에서 데이터 예제를 가져옴).
import pandas as pd
import numpy as np
# we know we're gonna have 5 rows of data
numberOfRows = 5
# create dataframe
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )
# now fill it up row by row
for x in np.arange(0, numberOfRows):
#loc or iloc both work here since the index is natural numbers
df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]:
lib qty1 qty2
0 -1 -1 -1
1 0 0 0
2 -1 0 -1
3 0 -1 0
4 -1 0 0
속도 비교
In[30]: %timeit tryThis() # function wrapper for this answer
In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop
그리고 주석에서와 같이 크기가 6000 인 경우 속도 차이가 훨씬 커집니다.
어레이 (12) 및 행 수 (500)의 크기를 늘리면 속도 차이가 더욱 두드러집니다. 313ms 대 2.29s
답변
mycolumns = ['A', 'B']
df = pd.DataFrame(columns=mycolumns)
rows = [[1,2],[3,4],[5,6]]
for row in rows:
df.loc[len(df)] = row
답변
효율적으로 추가하려면 팬더 데이터 프레임에 추가 행을 추가하는 방법 및 확대 설정 을 참조하십시오 .
를 통해 행을 추가 loc/ix
에 비 기존의 키 인덱스 데이터. 예 :
In [1]: se = pd.Series([1,2,3])
In [2]: se
Out[2]:
0 1
1 2
2 3
dtype: int64
In [3]: se[5] = 5.
In [4]: se
Out[4]:
0 1.0
1 2.0
2 3.0
5 5.0
dtype: float64
또는:
In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2),
.....: columns=['A','B'])
.....:
In [2]: dfi
Out[2]:
A B
0 0 1
1 2 3
2 4 5
In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A']
In [4]: dfi
Out[4]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
In [5]: dfi.loc[3] = 5
In [6]: dfi
Out[6]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
3 5 5 5