판다 데이터 프레임에 행 삽입
데이터 프레임이 있습니다.
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
A B C
0 5 6 7
1 7 8 9
[2 rows x 3 columns]
첫 번째 행 [2, 3, 4]을 추가해야 다음을 얻을 수 있습니다.
A B C
0 2 3 4
1 5 6 7
2 7 8 9
해습다봤니다니.append()
그리고.concat()
기능은 있지만 올바른 방법을 찾을 수 없습니다.
데이터 프레임에 영상 시리즈를 추가/삽입하는 방법은 무엇입니까?
됩니다.loc
:
df.loc[-1] = [2, 3, 4] # adding a row
df.index = df.index + 1 # shifting index
df = df.sort_index() # sorting by index
원하는 대로 얻을 수 있습니다.
A B C
0 2 3 4
1 5 6 7
2 7 8 9
자세한 내용은 Pandas 설명서 인덱싱: 확장 기능을 사용한 설정을 참조하십시오.
어떻게 전화하셨는지 잘 모르겠습니다.concat()
하지만 두 개체가 같은 유형이면 작동해야 합니다.두 번째 벡터를 데이터 프레임에 캐스팅해야 하는 것이 문제일 수도 있습니다.정의한 df를 사용하면 다음과 같은 작업이 가능합니다.
df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])
몇 가지 답을 테스트해 보면 다음을 사용하는 것이 확실합니다.pd.concat()
대용량 데이터 프레임의 경우 보다 효율적입니다.
를 사용하여 dict
그리고.list
,list
데이터 의 경우에는 효적이지, 모데프의경우, 수있다니습만사레용을 합니다.dict
문제가 없을 것이고 좀 더 읽기 쉬울 것입니다.
첫 번째 -pd.concat() + list
%%timeit
df = pd.DataFrame(columns=['a', 'b'])
for i in range(10000):
df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df], ignore_index=True)
루프당 4.88 s ± 47.1 ms(1987 ± 표준시).dev. 7회 주행, 각 루프 1회)
두 번째 -pd.append() + dict
%%timeit
df = pd.DataFrame(columns=['a', 'b'])
for i in range(10000):
df = df.append({'a': 1, 'b': 2}, ignore_index=True)
루프당 10.2초 ± 41.4 ms(1987 ± 표준시).dev. 7회 주행, 각 루프 1회)
세 번째 -pd.DataFrame().loc + index operations
%%timeit
df = pd.DataFrame(columns=['a','b'])
for i in range(10000):
df.loc[-1] = [1,2]
df.index = df.index + 1
df = df.sort_index()
루프당 17.5초 ± 37.3ms(1987 ± 표준시).dev. 7회 주행, 각 루프 1회)
이를 달성하는 한 가지 방법은
>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
일반적으로 데이터 프레임을 추가하는 것이 시리즈가 아니라 가장 쉽습니다.의 경우,에 "위에"(ID가 ) 이 없기 에 "위에"("ID가 있음) 기능이 없습니다.pd.prepend()
먼저 새 데이터 프레임을 만든 다음 이전 데이터 프레임을 추가합니다.
ignore_index
데이터 프레임에서 진행 중인 이전 인덱스를 무시하고 첫 번째 행이 실제로 인덱스로 시작되도록 합니다.1
로 다시 0
.
일반적인 고지 사항:Ceterocenso... 행을 추가하는 것은 상당히 비효율적인 작업입니다.성능에 관심이 있고 어떻게든 먼저 올바른(더 긴) 인덱스로 데이터 프레임을 생성한 다음 데이터 프레임에 추가 행을 삽입할 수 있다면 반드시 그렇게 해야 합니다.참조:
>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]:
A B C
0 5 6 7
1 7 8 9
2 NaN NaN NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]
지금까지, 우리는 당신이 가지고 있던 것을 가지고 있습니다.df
:
>>> df2
Out[339]:
A B C
0 NaN NaN NaN
1 5 6 7
2 7 8 9
그러나 이제 다음과 같이 행을 쉽게 삽입할 수 있습니다.공간이 미리 할당되었기 때문에, 이것이 더 효율적입니다.
>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
행을 삽입할 때 약간의 유연성을 허용하는 짧은 기능을 결합했습니다.
def insert_row(idx, df, df_insert):
dfA = df.iloc[:idx, ]
dfB = df.iloc[idx:, ]
df = dfA.append(df_insert).append(dfB).reset_index(drop = True)
return df
이를 더 줄여서 다음과 같이 표현할 수 있습니다.
def insert_row(idx, df, df_insert):
return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)
그런 다음 다음과 같은 방법을 사용할 수 있습니다.
df = insert_row(2, df, df_new)
2
는 의인스 위다니입치덱에 있는 입니다.df
를 삽입할 df_new
.
사용할 수 있습니다.이것은 유연성의 이점이 있습니다.삽입할 인덱스만 지정하면 됩니다.
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))
0 1 2
0 2 3 4
1 5 6 7
2 7 8 9
위해서np.insert(df.values, 0, values=[2, 3, 4], axis=0)
0은 함수에 새 값을 배치할 장소/색인을 나타냅니다.
팬더에게 줄을 추가하는 것은 꽤 간단합니다.DataFrame
:
동일한 열 이름을 사용하여 일반 Python 사전을 만듭니다.
Dataframe
;사용하다
pandas.append()
dictionary,, 방디어스법과..append()
인스턴스에 입니다.더하다
ignore_index=True
사전 이름 바로 뒤에 있습니다.
이것은 지나치게 단순해 보일 수 있지만 단순한 삽입 새 행 기능이 내장되어 있지 않다는 것이 놀랍습니다. 원본에 새로운 df를 추가하는 것에 대해 많이 읽었지만, 이것이 더 빠를지 궁금합니다.
df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]
아래는 인덱스를 정렬하거나 재설정하지 않고 판다 데이터 프레임에 행을 삽입하는 가장 좋은 방법입니다.
import pandas as pd
df = pd.DataFrame(columns=['a','b','c'])
def insert(df, row):
insert_loc = df.index.max()
if pd.isna(insert_loc):
df.loc[0] = row
else:
df.loc[insert_loc + 1] = row
insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)
concat()
마지막 행 삽입 및 재색인보다 약간 빠른 것 같습니다.누군가가 두 가지 상위 접근 방식의 속도에 대해 궁금해 할 경우:
In [x]: %%timeit
...: df = pd.DataFrame(columns=['a','b'])
...: for i in range(10000):
...: df.loc[-1] = [1,2]
...: df.index = df.index + 1
...: df = df.sort_index()
루프당 17.1초 ± 705 ms(1987 ± 표준시).dev. 7회 주행, 각 루프 1회)
In [y]: %%timeit
...: df = pd.DataFrame(columns=['a', 'b'])
...: for i in range(10000):
...: df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df])
루프당 6.53초 ± 127 ms(1987 ± 표준시).dev. 7회 주행, 각 루프 1회)
T 속성이 유효한 선택일 수도 있다는 생각이 들었습니다.전치, 다소 오해의 소지로부터 벗어날 수 있습니다.df.loc[-1] = [2, 3, 4]
@flow2k가 언급했듯이, 삽입하려는 것과 같은 보다 보편적인 상황에 적합합니다.[2, 3, 4]
행 에, 의의행 앞에어다이, 니습렵은것 임,다▁before.concat()
,append()
데 그리고 기능을 정의하고 디버깅하는 데 어려움을 겪지 않아도 됩니다.
a = df.T
a.insert(0,'anyName',value=[2,3,4])
# just give insert() any column name you want, we'll rename it.
a.rename(columns=dict(zip(a.columns,[i for i in range(a.shape[1])])),inplace=True)
# set inplace to a Boolean as you need.
df=a.T
df
A B C
0 2 3 4
1 5 6 7
2 7 8 9
저는 이것이 왜 팬더가 insert()처럼 행을 삽입할 방법이 없는지에 대한 @Matt Cochrane의 불만을 부분적으로 설명할 수 있다고 생각합니다.
에는 이중 괄호 bracket)를 합니다.[[...]]
의 경우iloc
.
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
# A B C
# 0 5 6 7
# 1 7 8 9
pd.concat((df.iloc[[0]], # [[...]] used to slice DataFrame as DataFrame
df), ignore_index=True)
# A B C
# 0 5 6 7
# 1 5 6 7
# 2 7 8 9
임의의 시간을 복제하거나 복제하려면 별과 결합합니다.
pd.concat((df.iloc[[0]],
df,
*[df.iloc[[1]]] * 4), ignore_index=True)
# A B C
# 0 5 6 7
# 1 7 8 9
# 2 7 8 9
# 3 7 8 9
# 4 7 8 9
행을 데이터 프레임의 끝에 추가한 다음 인덱스를 조정하기만 하면 됩니다.
예를 들어:
df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()
또는 사용concat
다음과 같이:
df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)
다음 예를 따릅니다.
a_row = pd.Series([1, 2])
df = pd.DataFrame([[3, 4], [5, 6]])
row_df = pd.DataFrame([a_row])
df = pd.concat([row_df, df], ignore_index=True)
결과는 다음과 같습니다.
0 1
0 1 2
1 3 4
2 5 6
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
새 행을 아무 곳에나 삽입하려면 행 위치를 지정할 수 있습니다. 맨 위에 삽입하려면 row_pos = -1을 지정하거나 행 0과 행 1 사이에 삽입하려면 row_pos = 0.5를 지정할 수 있습니다.
row_pos = -1
insert_row = [2,3,4]
df.loc[row_pos] = insert_row
df = df.sort_index()
df = df.reset_index(drop = True)
row_pos = -1
The outcome is:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
row_pos = 0.5
The outcome is:
A B C
0 5 6 7
1 2 3 4
2 7 8 9
열 이름을 사용하여 빈 df 만들기:
df = pd.DataFrame(columns = ["A", "B", "C"])
새 행 삽입:
df.loc[len(df.index)] = [2, 3, 4]
df.loc[len(df.index)] = [5, 6, 7]
df.loc[len(df.index)] = [7, 8, 9]
판다 데이터 프레임의 데이터 구조가 열 목록(각 열은 열)이므로 어떤 위치에 열을 삽입하는 것이 편리합니다.그래서 제가 생각해낸 한 가지 아이디어는 먼저 데이터 프레임을 전치하고 열을 삽입한 후 다시 전치하는 것입니다.다음과 같이 인덱스 이름(행 이름)을 변경해야 할 수도 있습니다.
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
df = df.transpose()
df.insert(0, 2, [2,3,4])
df = df.transpose()
df.index = [i for i in range(3)]
df
A B C
0 2 3 4
1 5 6 7
2 7 8 9
판다 데이터 프레임에서 행을 추가하는 가장 간단한 방법은 다음과 같습니다.
DataFrame.loc[ location of insertion ]= list( )
예:
DF.loc[ 9 ] = [ ´Pepe’ , 33, ´Japan’ ]
참고: 목록의 길이는 데이터 프레임의 길이와 일치해야 합니다.
언급URL : https://stackoverflow.com/questions/24284342/insert-a-row-to-pandas-dataframe
'programing' 카테고리의 다른 글
jQuery vs jQuery 모바일 vs jQuery UI? (0) | 2023.08.19 |
---|---|
부모가 호버링될 때 자식 요소의 CSS 변경 (0) | 2023.08.19 |
테스트에 사용자 지정된 ObjectMapper가 사용되지 않음 (0) | 2023.08.19 |
패싯 그리드의 xlim 및 ylim 설정 방법 (0) | 2023.08.19 |
새 줄을 유지하면서 도커 파일에 여러 줄로 명령을 작성하는 방법은 무엇입니까? (0) | 2023.08.19 |