[python] 팬더 DataFrame에 한 행 추가

팬더가 완전히 채워지도록 설계 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


답변

데이터 프레임에 대한 모든 데이터를 미리 가져올 수있는 경우 데이터 프레임에 추가하는 것보다 훨씬 빠른 방법이 있습니다.

  1. 각 사전이 입력 데이터 행에 해당하는 사전 목록을 작성하십시오.
  2. 이 목록에서 데이터 프레임을 작성하십시오.

행 단위로 데이터 프레임을 추가하는 데 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 주석 후에도 업데이트 됨

속도 성능

  1. .append 사용하기 ( NPE ‘s answer )
  2. .loc 사용하기 ( fred ‘s answer )
  3. 사전 할당과 함께 .loc 사용하기 ( FooBar ‘s answer )
  4. 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