for 루프에서 팬더 데이터 프레임의 행을 추가하는 방법?
루프에 대해 다음과 같은 것이 있습니다.
for i in links:
data = urllib2.urlopen(str(i)).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
이렇게 생성된 각 데이터 프레임에는 대부분의 열이 다른 열과 공통적으로 있지만 모든 열이 있는 것은 아닙니다.게다가, 그들은 모두 한 줄밖에 가지고 있지 않습니다.for 루프에서 생성된 각 데이터 프레임에서 다른 모든 열과 각 행을 데이터 프레임에 추가해야 합니다.
나는 판다들이 컨카테네이트 혹은 유사한 것들을 시도해 보았지만 아무것도 효과가 없는 것 같았습니다.감 잡히는 게 없어요?감사해요.
데이터가 다음과 같다고 가정합니다.
import pandas as pd
import numpy as np
np.random.seed(2015)
df = pd.DataFrame([])
for i in range(5):
data = dict(zip(np.random.choice(10, replace=False, size=5),
np.random.randint(10, size=5)))
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
df = df.append(data)
print('{}\n'.format(df))
# 0 0 1 2 3 4 5 6 7 8 9
# 1 6 NaN NaN 8 5 NaN NaN 7 0 NaN
# 1 NaN 9 6 NaN 2 NaN 1 NaN NaN 2
# 1 NaN 2 2 1 2 NaN 1 NaN NaN NaN
# 1 6 NaN 6 NaN 4 4 0 NaN NaN NaN
# 1 NaN 9 NaN 9 NaN 7 1 9 NaN NaN
그 다음에 그것을 대체할 수 있습니다.
np.random.seed(2015)
data = []
for i in range(5):
data.append(dict(zip(np.random.choice(10, replace=False, size=5),
np.random.randint(10, size=5))))
df = pd.DataFrame(data)
print(df)
즉, 각 행에 대해 새 DataFrame을 형성하지 마십시오.대신 명령어 목록에 있는 모든 데이터를 수집한 다음 호출합니다.df = pd.DataFrame(data)
마지막에 한 번, 고리 밖에서.
통화할 때마다df.append
는 하나의 추가 행으로 새 DataFrame을 위한 공간을 할당하고, 원래 DataFrame의 모든 데이터를 새 DataFrame으로 복사한 다음 새 행으로 데이터를 복사해야 합니다.모든 할당과 복사가 전화를 걸게 합니다.df.append
매우 비효율적으로 순환하고 있습니다.복사 시간 비용은 행 수에 따라 4차적으로 증가합니다.Call-DataFrame 코드는 쓰기가 더 쉬울 뿐만 아니라 성능도 훨씬 향상됩니다. 복사 시간 비용은 행 수에 따라 선형적으로 증가합니다.
루프에서 행을 추가할 수 있는 이유는 2가지, 1. 기존의 df에 추가할 수 있고 2. 새로운 df를 생성할 수 있습니다.
새로운 df를 만들려면 데이터를 목록으로 만든 다음 데이터 프레임을 만들어야 한다는 것이 잘 문서화되어 있다고 생각됩니다.
cols = ['c1', 'c2', 'c3']
lst = []
for a in range(2):
lst.append([1, 2, 3])
df1 = pd.DataFrame(lst, columns=cols)
df1
Out[3]:
c1 c2 c3
0 1 2 3
1 1 2 3
또는 인덱스를 사용하여 데이터 프레임을 생성한 후 추가합니다.
cols = ['c1', 'c2', 'c3']
df2 = pd.DataFrame(columns=cols, index=range(2))
for a in range(2):
df2.loc[a].c1 = 4
df2.loc[a].c2 = 5
df2.loc[a].c3 = 6
df2
Out[4]:
c1 c2 c3
0 4 5 6
1 4 5 6
기존 데이터 프레임에 추가하려면 위의 방법 중 하나를 사용한 다음 df를 함께 추가할 수 있습니다(인덱스 포함 여부).
df3 = df2.append(df1, ignore_index=True)
df3
Out[6]:
c1 c2 c3
0 4 5 6
1 4 5 6
2 1 2 3
3 1 2 3
또는 위의 답변과 같이 사전 항목 목록을 만들어 추가할 수도 있습니다.
lst_dict = []
for a in range(2):
lst_dict.append({'c1':2, 'c2':2, 'c3': 3})
df4 = df1.append(lst_dict)
df4
Out[7]:
c1 c2 c3
0 1 2 3
1 1 2 3
0 2 2 3
1 2 2 3
dict(zip(cols, vals)) 사용
lst_dict = []
for a in range(2):
vals = [7, 8, 9]
lst_dict.append(dict(zip(cols, vals)))
df5 = df1.append(lst_dict)
아래 의견에서 나온 아이디어를 포함하면 다음과 같습니다.
Pandas는 데이터 프레임에 추가할 수 있는 효과적인 방법을 가지고 있는 것으로 드러났습니다.
df.loc[ len(df) ] = [new, row, of, data]
(이것은) 제자리에 있는 데이터 프레임의 끝까지 "append"됩니다.– 데미스 3월 22일 15시 32분
보다 콤팩트하고 효율적인 방법은 다음과 같습니다.
cols = ['frame', 'count']
N = 4
dat = pd.DataFrame(columns = cols)
for i in range(N):
dat = dat.append({'frame': str(i), 'count':i},ignore_index=True)
출력은 다음과 같습니다.
>>> dat
frame count
0 0 0
1 1 1
2 2 2
3 3 3
임시 빈 데이터 프레임을 사용하여 for loop에 데이터 프레임을 만들었습니다.for loop의 모든 반복에 대해 새로운 데이터 프레임이 생성되어 이전 반복의 내용을 덮어씁니다.
따라서 데이터 프레임의 내용을 이미 생성된 빈 데이터 프레임으로 이동해야 합니다.그것은 저것만큼 간단합니다.아래와 같이 .append 기능만 사용하면 됩니다.
temp_df = pd.DataFrame() #Temporary empty dataframe
for sent in Sentences:
New_df = pd.DataFrame({'words': sent.words}) #Creates a new dataframe and contains tokenized words of input sentences
temp_df = temp_df.append(New_df, ignore_index=True) #Moving the contents of newly created dataframe to the temporary dataframe
for 루프 외부에서 임시 데이터 프레임의 내용을 마스터 데이터 프레임에 복사한 후 필요 없는 경우 임시 데이터 프레임을 삭제할 수 있습니다.
먼저 열 이름이 있는 빈 DataFrame을 만든 다음 for 루프 내부에서 추가할 데이터가 있는 사전(행)을 정의해야 합니다.
df = pd.DataFrame(columns=['A'])
for i in range(5):
df = df.append({'A': i}, ignore_index=True)
df
A
0 0
1 1
2 2
3 3
4 4
열이 더 많은 행을 추가하려는 경우 코드는 다음과 같습니다.
df = pd.DataFrame(columns=['A','B','C'])
for i in range(5):
df = df.append({'A': i,
'B': i * 2,
'C': i * 3,
}
,ignore_index=True
)
df
A B C
0 0 0 0
1 1 2 3
2 2 4 6
3 3 6 9
4 4 8 12
언급URL : https://stackoverflow.com/questions/31674557/how-to-append-rows-in-a-pandas-dataframe-in-a-for-loop
'programing' 카테고리의 다른 글
하위 프로세스 호출을 텍스트 파일로 전송하려면 어떻게 해야 합니까? (0) | 2023.10.29 |
---|---|
서비스 방법을 만들 때 module.service와 module.factory의 차이점은 무엇입니까? (0) | 2023.10.29 |
nodejs의 폴더 아래에 있는 *. html 확장명으로 파일 찾기 (0) | 2023.10.29 |
"너무 많은 데이터베이스 연결"의 원인 (0) | 2023.10.29 |
사용자 지정 비교 술어가 포함된 힙큐 (0) | 2023.10.29 |