데이터 프레임이 있습니다.
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.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 포함) 있고 함수가 없기 때문에 pd.prepend()
먼저 새 데이터 프레임을 만든 다음 이전 데이터 프레임을 추가합니다.
ignore_index
데이터 프레임에서 기존의 진행중인 인덱스를 무시하고 첫 번째 행이 index 1
로 다시 시작하는 대신 실제로 인덱스로 시작하는지 확인합니다 0
.
일반적인 고지 사항 : Cetero censeo … 행 추가는 매우 비효율적 인 작업입니다. 성능에 관심이 있고 먼저 올바른 (더 긴) 인덱스를 사용하여 데이터 프레임을 만든 다음 추가 행을 데이터 프레임에 삽입 할 수 있다면 반드시 그렇게해야합니다. 보다:
>>> 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
.
답변
우리는 numpy.insert
. 이것은 유연성의 장점이 있습니다. 삽입하려는 색인 만 지정하면됩니다.
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은 새 값을 배치하려는 장소 / 색인을 함수에 알려줍니다.
답변
이것은 지나치게 간단 해 보일 수 있지만 간단한 새 행 삽입 기능이 내장되어 있지 않다는 것이 놀랍습니다. 원본에 새 df를 추가하는 방법에 대해 많이 읽었지만 이것이 더 빠를 지 궁금합니다.
df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]
답변
다음은 색인을 정렬하고 재설정하지 않고 pandas 데이터 프레임에 행을 삽입하는 가장 좋은 방법입니다.
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)