한 번에 한 행을 추가하여 Panda 데이터 프레임 생성
'공백'을 해야 하나요?DataFrame
을을하 ?나 ?? ????
빈칸을 만들었습니다.DataFrame
:
df = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
그런 다음 끝에 새 행을 추가하고 단일 필드에 다음을 채울 수 있습니다.
df = df._set_value(index=len(df), col='qty1', value=10.0)
한 번에 하나의 필드에서만 작동합니다.「」에 입니까?df
하시면 됩니다.df.loc[i]
서 인덱스가 " " " 입니다.i
데이터 프레임에 지정되는 것이 됩니다.
>>> 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
데이터 프레임의 모든 데이터를 미리 가져올 수 있는 경우 데이터 프레임에 추가하는 것보다 훨씬 빠른 방법이 있습니다.
- 각 사전이 입력 데이터 행에 해당하는 사전 목록을 만듭니다.
- 이 목록에서 데이터 프레임을 만듭니다.
데이터 프레임을 한 줄씩 추가하는 작업이나 사전 목록에서 몇 초 만에 데이터 프레임을 만드는 작업도 비슷한 작업이 있었습니다.
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)
데이터 프레임에 행을 많이 추가할 경우 성능에 관심이 있습니다.그래서 나는 가장 인기 있는 네 가지 방법을 시도해 보고 속도를 체크했다.
성능
- .append 사용(NPE의 답변)
- .loc 사용(프레드의 답변)
- 사전 할당과 함께 .loc 사용(FooBar의 답변)
- 최종적으로 dict를 사용하여 Data Frame을 만듭니다(SikharDua의 답변).
런타임 결과(초):
접근 | 1000행 | 5000행 | 10,000 행 |
---|---|---|---|
.disclosed(비활성화) | 0.69 | 3.39 | 6.78 |
.loc (사전 할당 없음) | 0.74 | 3.90 | 8.35 |
.loc(사전 할당) | 0.24 | 2.58 | 8.70 |
받아쓰다 | 0.012 | 0.046 | 0.084 |
그래서 나는 사전을 통한 덧셈을 나 자신을 위해 사용한다.
코드:
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)
추신: 저는 제 깨달음이 완벽하지 않다고 생각합니다.아마 최적화가 이루어질 수 있을 것 같습니다.
하면 .pandas.concat()
★★★★★★★★★★★★★★★★★」DataFrame.append()
자세한 내용과 예는 병합, 결합 및 연결을 참조하십시오.
데이터 프레임은 절대 확장하지 마세요!
예, 사람들은 이미 DataFrame을 확장해서는 안 되며, 데이터를 목록에 추가하고 마지막에 DataFrame으로 변환해야 한다고 설명했습니다.하지만 왜 그런지 알겠어요?
여기 제 직책에서 인용한 가장 중요한 이유들이 있습니다.
- 목록에 추가하고 Data Frame을 한 번에 생성하는 것이 항상 더 저렴하고 빠릅니다.
- 목록은 메모리를 적게 사용하고 작업, 추가 및 삭제하기에 훨씬 더 가벼운 데이터 구조입니다.
dtypes
이치노의 빈 으로 NaN이 .object
안 좋은 거죠- 추가하는 행에 올바른 인덱스를 할당하지 않아도 인덱스가 자동으로 생성됩니다.
이것이 데이터를 축적하는 올바른 방법™입니다.
data = []
for a, b, c in some_function_that_yields_data():
data.append([a, b, c])
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
이 옵션들은 끔찍하다.
append
★★★★★★★★★★★★★★★★★」concat
내append
★★★★★★★★★★★★★★★★★」concat
고립되어 있다고 해서 나쁜 건 아니에요루프 내에서 반복적으로 호출하면 문제가 발생하며, 이로 인해 2차 메모리 사용량이 발생합니다.# Creates empty DataFrame and appends df = pd.DataFrame(columns=['A', 'B', 'C']) for a, b, c in some_function_that_yields_data(): df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True) # This is equally bad: # df = pd.concat( # [df, pd.Series({'A': i, 'B': b, 'C': c})], # ignore_index=True)
NaN의 빈 데이터 프레임
은 NaN DataFrame으로 .
object
('Dtype'은 'Dtype').# Creates DataFrame of NaNs and overwrites values. df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5)) for a, b, c in some_function_that_yields_data(): df.loc[len(df)] = [a, b, c]
증명은 푸딩 안에 있다
이러한 방법의 타이밍을 재는 것이, 메모리와 유틸리티의 차이가 어느 정도인지를 알 수 있는 가장 빠른 방법입니다.
제가 왜 이 커뮤니티의 일원이 되었는지를 상기시켜주는 게시물들이에요.사람들은 잘못된 코드로 정답을 맞추는 것이 아니라 올바른 코드로 정답을 맞추는 것을 가르치는 것의 중요성을 알고 있습니다.이제 사용할 문제가 아니라고 주장할 수 있습니다.loc
★★★★★★★★★★★★★★★★★」append
데이터 프레임에 행을 하나만 추가하는 경우.단, 이 질문에 대해 여러 행을 추가하는 경우가 많습니다.많은 경우 함수의 데이터를 사용하여 루프 내부에 행을 반복적으로 추가해야 합니다(관련 질문 참조).이 경우 Data Frame을 반복적으로 확장하는 것은 좋은 생각이 아니라는 것을 이해하는 것이 중요합니다.
엔트리의 수를 미리 알고 있는 경우는 인덱스를 제공하여 공간을 미리 할당해야 합니다(다른 답변의 데이터 예제를 참조).
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
한 수 있어요.ignore_index
★★★★★★ 。
>>> f = pandas.DataFrame(data = {'Animal':['cow','horse'], 'Color':['blue', 'red']})
>>> f
Animal Color
0 cow blue
1 horse red
>>> f.append({'Animal':'mouse', 'Color':'black'}, ignore_index=True)
Animal Color
0 cow blue
1 horse red
2 mouse black
효율적인 추가를 위해 팬더 데이터 프레임에 행을 추가하는 방법 및 확대 설정을 참조하십시오.
~를 합니다.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
피토닉 방식을 위해:
res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
res = res.append([{'qty1':10.0}], ignore_index=True)
print(res.head())
lib qty1 qty2
0 NaN 10.0 NaN
목록 목록을 작성하여 데이터 프레임으로 변환할 수도 있습니다.
import pandas as pd
columns = ['i','double','square']
rows = []
for i in range(6):
row = [i, i*2, i*i]
rows.append(row)
df = pd.DataFrame(rows, columns=columns)
부여
i이중사각형0 0 0 01 1 2 12 2 4 43 3 6 94 4 8 165 5 10 25
간단하고 좋은 방법을 찾아냈어
>>> df
A B C
one 1 2 3
>>> df.loc["two"] = [4,5,6]
>>> df
A B C
one 1 2 3
two 4 5 6
코멘트에 기재되어 있는 퍼포먼스에 관한 경고에 주의해 주세요.
항상 마지막에 새 행을 추가할 경우 다음을 사용합니다.
df.loc[len(df)] = ['name5', 9, 0]
이것은 OP 질문에 대한 답변이 아니라 ShikharDua의 답변을 예시하는 장난감 사례로 매우 유용하다고 생각합니다.
이 fragment는 사소한 것이지만, 실제 데이터에는 1,000개의 행과 많은 열이 있으며, 여러 개의 타깃 열에 대해 다른 열을 기준으로 그룹화하여 아래 통계를 수행할 수 있기를 희망했습니다.따라서 데이터 프레임을 한 번에 한 줄씩 작성하는 안정적인 방법이 있으면 매우 편리했습니다.쉬하르두아 감사합니다!
import pandas as pd
BaseData = pd.DataFrame({ 'Customer' : ['Acme','Mega','Acme','Acme','Mega','Acme'],
'Territory' : ['West','East','South','West','East','South'],
'Product' : ['Econ','Luxe','Econ','Std','Std','Econ']})
BaseData
columns = ['Customer','Num Unique Products', 'List Unique Products']
rows_list=[]
for name, group in BaseData.groupby('Customer'):
RecordtoAdd={} #initialise an empty dict
RecordtoAdd.update({'Customer' : name}) #
RecordtoAdd.update({'Num Unique Products' : len(pd.unique(group['Product']))})
RecordtoAdd.update({'List Unique Products' : pd.unique(group['Product'])})
rows_list.append(RecordtoAdd)
AnalysedData = pd.DataFrame(rows_list)
print('Base Data : \n',BaseData,'\n\n Analysed Data : \n',AnalysedData)
생성기 개체를 사용하여 데이터 프레임을 만들 수 있습니다. 그러면 목록에 비해 메모리 효율성이 향상됩니다.
num = 10
# Generator function to generate generator object
def numgen_func(num):
for i in range(num):
yield ('name_{}'.format(i), (i*i), (i*i*i))
# Generator expression to generate generator object (Only once data get populated, can not be re used)
numgen_expression = (('name_{}'.format(i), (i*i), (i*i*i)) for i in range(num) )
df = pd.DataFrame(data=numgen_func(num), columns=('lib', 'qty1', 'qty2'))
raw를 기존 DataFrame에 추가하려면 append 메서드를 사용합니다.
df = df.append([{ 'lib': "name_20", 'qty1': 20, 'qty2': 400 }])
ShikharDua의 답변과 같은 사전 목록(행 기반)이 아니라, 사전에 열을 알고 있기 때문에 각 목록이 행 순서대로 열을 저장하는 목록 사전(열 기반)으로 테이블을 나타낼 수도 있습니다.마지막으로 Data Frame을 한 번 구축합니다.
두 경우 모두 사전 키는 항상 열 이름입니다.행 순서는 암묵적으로 목록의 순서로 저장됩니다.c컬럼과 n개의 행에 대해서는 n개의 사전과 비교하여 c리스트의 사전이 1개 사용됩니다.List-of-Dictionary 메서드에서는 각 사전이 모든 키를 용장하게 저장하므로 각 행에 대해 새 사전을 생성해야 합니다.여기서는 목록에만 추가합니다.이것들은 전체적으로 같은 시간 복잡도(목록과 사전을 추가하는 것은 모두 상각된 상수 시간)이지만 단순한 조작이기 때문에 오버헤드가 적을 수 있습니다.
# Current data
data = {"Animal":["cow", "horse"], "Color":["blue", "red"]}
# Adding a new row (be careful to ensure every column gets another value)
data["Animal"].append("mouse")
data["Color"].append("black")
# At the end, construct our DataFrame
df = pd.DataFrame(data)
# Animal Color
# 0 cow blue
# 1 horse red
# 2 mouse black
새 레코드(데이터 프레임)를 생성하여 old_data_frame에 추가합니다.
값 목록과 대응하는 열 이름을 전달하여 new_record(data_frame)를 만듭니다.
new_record = pd.DataFrame([[0, 'abcd', 0, 1, 123]], columns=['a', 'b', 'c', 'd', 'e'])
old_data_frame = pd.concat([old_data_frame, new_record])
을 추가과 같습니다.DataFrame
:
def add_row(df, row):
df.loc[-1] = row
df.index = df.index + 1
return df.sort_index()
add_row(df, [1,2,3])
비어 있거나 채워진 Panda DataFrame에 행을 삽입/추가하는 데 사용할 수 있습니다.
마지막에 행을 추가하려면 목록으로 추가합니다.
valuestoappend = [va1, val2, val3]
res = res.append(pd.Series(valuestoappend, index = ['lib', 'qty1', 'qty2']), ignore_index = True)
또 다른 방법(퍼포먼스는 그다지 높지 않을 수 있음)은 다음과 같습니다.
# add a row
def add_row(df, row):
colnames = list(df.columns)
ncol = len(colnames)
assert ncol == len(row), "Length of row must be the same as width of DataFrame: %s" % row
return df.append(pd.DataFrame([row], columns=colnames))
다음과 같이 DataFrame 클래스를 확장할 수도 있습니다.
import pandas as pd
def add_row(self, row):
self.loc[len(self.index)] = row
pd.DataFrame.add_row = add_row
필요한 건loc[df.shape[0]]
또는loc[len(df)]
# Assuming your df has 4 columns (str, int, str, bool)
df.loc[df.shape[0]] = ['col1Value', 100, 'col3Value', False]
또는
df.loc[len(df)] = ['col1Value', 100, 'col3Value', False]
initial_data = {'lib': np.array([1,2,3,4]), 'qty1': [1,2,3,4], 'qty2': [1,2,3,4]}
df = pd.DataFrame(initial_data)
df
lib qty1 qty2
0 1 1 1
1 2 2 2
2 3 3 3
3 4 4 4
val_1 = [10]
val_2 = [14]
val_3 = [20]
df.append(pd.DataFrame({'lib': val_1, 'qty1': val_2, 'qty2': val_3}))
lib qty1 qty2
0 1 1 1
1 2 2 2
2 3 3 3
3 4 4 4
0 10 14 20
for 루프를 사용하여 값을 반복하거나 값 배열을 추가할 수 있습니다.
val_1 = [10, 11, 12, 13]
val_2 = [14, 15, 16, 17]
val_3 = [20, 21, 22, 43]
df.append(pd.DataFrame({'lib': val_1, 'qty1': val_2, 'qty2': val_3}))
lib qty1 qty2
0 1 1 1
1 2 2 2
2 3 3 3
3 4 4 4
0 10 14 20
1 11 15 21
2 12 16 22
3 13 17 43
이를 위해 2개의 데이터 프레임을 연결할 수 있습니다.기본적으로 이 문제는 기존 DataFrame에 새로운 행을 추가하기 위해 발생하였습니다(숫자가 아님).
그래서 새 행의 데이터를 dut()에 입력하고 인덱스를 목록에 입력합니다.
new_dict = {put input for new row here}
new_list = [put your index here]
new_df = pd.DataFrame(data=new_dict, index=new_list)
df = pd.concat([existing_df, new_df])
간단히 해 주세요.데이터 프레임에 행으로 추가되는 목록을 입력으로 받아들임으로써 다음을 수행합니다.
import pandas as pd
res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
for i in range(5):
res_list = list(map(int, input().split()))
res = res.append(pd.Series(res_list, index=['lib', 'qty1', 'qty2']), ignore_index=True)
panda.DataFrame.append
DataFrame.append(본인, 기타, ignore_index=False, verify_integrity=False, sort=False) → 'DataFrame'
코드
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df.append(df2)
ignore_index가 True로 설정된 경우:
df.append(df2, ignore_index=True)
데이터 프레임이 있는 경우df
목록을 추가하고 싶다. new_list
에 대한 새로운 행으로서df
다음과 같은 작업을 수행할 수 있습니다.
df.loc[len(df)] = new_list
새 데이터 프레임을 추가하려면 new_df
데이터 프레임 아래df
, 그 후 다음을 사용할 수 있습니다.
df.append(new_df)
우리는 종종 그 구조를 본다.df.loc[subscript] = …
1개의 DataFrame 행에 할당합니다.Mikhail_Sam은 이 구성뿐만 아니라 최종적으로 dict 및 create DataFrame을 사용하는 방법을 포함하는 벤치마크를 게시했습니다.그는 후자가 단연코 가장 빠르다는 것을 알았다.
하지만 만약 우리가 이 시스템을df3.loc[i] = …
(사전 할당된 Data Frame을 사용하여) 코드로df3.values[i] = …
이 메서드는 dict를 사용하는 경우와 유사하게 수행된다는 점에서 결과가 크게 달라집니다. 더 자주 .df.values[subscript] = …
, 이 점에 유의하십시오..values
는 제로 베이스의 첨자를 사용합니다.DataFrame.index 를를 。
행을 추가하기 전에 데이터 프레임을 사전으로 변환해야 합니다.여기서 키는 데이터 프레임의 열로 표시되며 열의 값은 다시 사전에 저장됩니다.단, 각 열의 키는 데이터 프레임의 인덱스 번호입니다.
그 아이디어로 인해 아래 코드를 작성하게 되었습니다.
df2 = df.to_dict()
values = ["s_101", "hyderabad", 10, 20, 16, 13, 15, 12, 12, 13, 25, 26, 25, 27, "good", "bad"] # This is the total row that we are going to add
i = 0
for x in df.columns: # Here df.columns gives us the main dictionary key
df2[x][101] = values[i] # Here the 101 is our index number. It is also the key of the sub dictionary
i += 1
데이터 프레임의 모든 데이터가 동일한 dtype인 경우 NumPy 어레이를 사용할 수 있습니다.행을 미리 정의된 배열에 직접 쓰고 마지막에 데이터 프레임으로 변환할 수 있습니다.딕트 목록을 변환하는 것보다 더 빠른 것 같습니다.
import pandas as pd
import numpy as np
from string import ascii_uppercase
startTime = time.perf_counter()
numcols, numrows = 5, 10000
npdf = np.ones((numrows, numcols))
for row in range(numrows):
npdf[row, 0:] = np.random.randint(0, 100, (1, numcols))
df5 = pd.DataFrame(npdf, columns=list(ascii_uppercase[:numcols]))
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df5.shape)
이 코드 조각은 사전 목록을 사용하여 데이터 프레임을 업데이트합니다.그것은 ShikharDua와 Michail_Sam의 대답에 더해진다.
import pandas as pd
colour = ["red", "big", "tasty"]
fruits = ["apple", "banana", "cherry"]
dict1={}
feat_list=[]
for x in colour:
for y in fruits:
# print(x, y)
dict1 = dict([('x',x),('y',y)])
# print(f'dict 1 {dict1}')
feat_list.append(dict1)
# print(f'feat_list {feat_list}')
feat_df=pd.DataFrame(feat_list)
feat_df.to_csv('feat1.csv')
언급URL : https://stackoverflow.com/questions/10715965/create-a-pandas-dataframe-by-appending-one-row-at-a-time
'programing' 카테고리의 다른 글
Java 날짜 컷오프 시간 정보 (0) | 2023.01.14 |
---|---|
1바이트에 몇 글자를 저장할 수 있습니까? (0) | 2023.01.14 |
JavaScript 링크에는 "#" 또는 "javascript:void(0)" 중 어떤 "href" 값을 사용해야 합니까? (0) | 2023.01.14 |
Node.js를 사용하여 명령줄 바이너리를 실행합니다. (0) | 2023.01.14 |
Maven 오류: 메인 클래스 org.codehouse.plexus.classworlds.launcher를 찾거나 로드할 수 없습니다.런처 (0) | 2023.01.04 |