Pandas 데이터 프레임에 행 삽입


112

데이터 프레임이 있습니다.

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() 기능했지만 올바른 방법을 찾을 수 없습니다.

데이터 프레임에 시리즈를 추가 / 삽입하는 방법은 무엇입니까?


6
을 사용 하여 완전히 새로운 목록을 만드는 s1.values것과는 반대로 사용하는 것이 좋습니다 . list(s1)list(s1)
acushner 2014-06-18

7
너무 단순해야하는 것이 엉덩이에 너무 고통스럽고 너무 느릴 때 왜 모든 사람들이 팬더를 좋아하는지 이해가 안 돼요.
MattCochrane

답변:


145

다음을 사용하여 특정 인덱스에 행을 할당하십시오 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 문서 인덱싱 : 확대 설정을 참조하십시오 .


2
확대 설정을 원하지 않고 데이터 프레임 내부에 삽입하는 경우 stackoverflow.com/questions/15888648/...
FOOBAR

6
이동 인덱스 대안 : df.sort (). reset_index (drop = True)
Meloun

2
df.sort는 더 이상 사용되지 않습니다. df.sort_index ()
GBGOLC 사용

1
@Piotr-이것은 훌륭하게 작동하지만 데이터 프레임에서 행을 복제 df.loc[-1] = df.iloc[[0]]하고 삽입하려면 어떻게됩니까? 프레임에는 오류를 제공하는 추가 인덱스 열이 함께 제공됩니다 ValueError: cannot set a row with mismatched columns ( stackoverflow.com/questions/47340571/… 참조 )
Growler

5
파이썬 배열과 마찬가지로 마지막 행 / 요소가 아니기 때문에 df.loc[-1] = [2, 3, 4] # adding a row약간 오해의 소지가 있다고 생각 -1합니다.
flow2k

26

어떻게 호출했는지 확실하지 concat()않지만 두 개체가 동일한 유형이면 작동합니다. 문제는 두 번째 벡터를 데이터 프레임으로 캐스트해야한다는 것입니까? 정의한 df를 사용하면 다음과 같이 작동합니다.

df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])

우수 답변 ^ :)
Cam.Davidson.Pilon

23

이를 달성하는 한 가지 방법은

>>> 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

그것은 좋은 해결 방법입니다. 시리즈를 데이터 프레임에 삽입하려고했습니다. 지금은 충분합니다.
Meloun 2014-06-18

나는 마지막 옵션을 가장 좋아합니다. 이것은 내가 정말로하고 싶은 일과 정말로 일치합니다. @FooBar 감사합니다!
Jade Cacho

13

행을 삽입 할 때 약간의 유연성을 허용하는 짧은 함수를 작성했습니다.

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.


7

우리는 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은 새 값을 배치하려는 장소 / 색인을 함수에 알려줍니다.


6

이것은 지나치게 간단 해 보일 수 있지만 간단한 새 행 삽입 기능이 내장되어 있지 않다는 것이 놀랍습니다. 원본에 새 df를 추가하는 방법에 대해 많이 읽었지만 이것이 더 빠를 지 궁금합니다.

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]

코드에서 볼 수 있듯이 "새 df 추가"또는 "새 행 추가"를 의미 했습니까?
smci

문장이 명확하지 않아서 죄송합니다. 단일 행으로 완전히 새로운 데이터 프레임을 연결 / 추가하는 다른 사람들의 솔루션을 읽었습니다. 하지만 내 솔루션에 추가 dataframe 필요없이 기존 dataframe에서의 단 하나의 행이 생성 될
아론 멜 가르

6

다음은 색인을 정렬하고 재설정하지 않고 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)

왜 이것이 최선의 방법이라고 말하겠습니까?
Yuca

그 주장을 뒷받침하는 증거를 제공하는 것이 좋을 것입니다. 시간을 정했습니까?
Yuca 19.04.15

1
pd.isna를 사용하여 numpy 가져 오기를 피할 수 있습니다
kato2

2

pandas에 행을 추가하는 것은 매우 간단합니다 DataFrame.

  1. 당신과 같은 열 이름을 가진 일반 파이썬 사전을 만듭니다 Dataframe.

  2. pandas.append()메서드를 사용 하고 사전의 이름을 전달 .append()합니다. 여기서은 DataFrame 인스턴스의 메서드입니다.

  3. ignore_index=True사전 이름 바로 뒤에 추가하십시오 .


이것은 아마도 가장 선호되는 옵션 일 것입니다 (2020 년경).
David Golembiowski

1

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 초 ± 705ms (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 초 ± 127ms (7 회 실행의 평균 ± 표준 편차, 각 1 회 루프)


0

DataFrame 끝에 행을 추가 한 다음 인덱스를 조정하기 만하면됩니다.

예를 들면 :

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)

-1

pandas 데이터 프레임에 행을 추가하는 가장 간단한 방법은 다음과 같습니다.

DataFrame.loc[ location of insertion ]= list( )

예 :

DF.loc[ 9 ] = [ ´Pepe , 33, ´Japan ]

주의 : 목록의 길이는 데이터 프레임의 길이와 일치해야합니다.


나를 위해 트릭을 했어!
Sam Shaw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.