파이썬 팬더 : 행 단위로 데이터 프레임 채우기


133

pandas.DataFrame객체에 행을 추가하는 간단한 작업은 달성하기 어려운 것 같습니다. 이와 관련하여 3 가지 스택 오버 플로우 질문이 있지만 그중 아무것도 작동하지 않습니다.

여기 내가하려는 일이 있습니다. 행과 열의 이름뿐만 아니라 모양을 이미 알고있는 DataFrame이 있습니다.

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

이제 행의 값을 반복적으로 계산하는 기능이 있습니다. 사전 또는 pandas.Series?로 행 중 하나를 채우려면 어떻게해야 합니까? 실패한 다양한 시도는 다음과 같습니다.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

분명히 행 대신 열을 추가하려고했습니다.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

매우 유익하지 않은 오류 메시지.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

분명히 그것은 데이터 프레임에서 개별 값을 설정하기위한 것입니다.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

글쎄, 나는 색인을 무시하고 싶지 않다. 그렇지 않으면 결과는 다음과 같다.

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

열 이름을 값에 맞추었지만 행 레이블을 잃었습니다.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

그것은 또한 비참하게 실패했습니다.

어떻게합니까?

답변:


92

df['y'] 열을 설정합니다

행을 설정하고 싶기 때문에 .loc

.ix당신이 행의 각 요소에 사전을 할당하려하기 때문에 여기에 해당합니다는, 당신은 실패 y원하지 것을 아마; Series로 변환하면 팬더에게 입력을 정렬 할 것을 지시합니다 (예 : 모든 요소를 ​​지정할 필요는 없습니다)

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

내가 참조. 따라서 loc데이터 프레임 의 속성은 __setitem__내가 생각하는 마술을 하는 스페셜 을 정의합니다 .
xApple

이것을 한 번에 (예 : 열, 색인 및 y로) 구성 할 수 있습니까?
Andy Hayden

5
따라서 한 번에 하나의 행을 생성 할 수 있다면 데이터 프레임을 최적으로 구성하는 방법은 무엇입니까?
xApple

변형이 예상 df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])되는가?
Andy Hayden

@xApple prob 당신이 dicts (또는 list)리스트를 구성하고 생성자에게 전달하는 것이 가장 효율적입니다
Jeff

71

내 접근 방식 이었지만 이것이 가장 빠른 솔루션임을 보장 할 수는 없습니다.

df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

4
이것은 나를 위해 훌륭하게 작동했으며 append데이터 프레임에 데이터를 명시 적으로 적용한다는 사실을 좋아합니다 .
Jonny Brooks

1
이 답변에는 각 행에 열 이름이 추가되어야합니다. 허용 된 답변에 대해서도 동일합니다.
pashute

미리 행 수를 모르는 경우에도 작동합니다.
irene

34

이것은 더 간단한 버전입니다

import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

4
이 CPU와 메모리가 효율적입니까?
czxttkl

1
매번 마지막 행에 추가하도록 df의 마지막 행을 어떻게 알 수 있습니까?
pashute

25

입력 행이 사전이 아닌 목록 인 경우 다음은 간단한 해결책입니다.

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6

다중 인덱스가 있으면 어떻게해야합니까? df1 = pd.DataFrame (list_of_lists, columns [ 'A', 'B', 'C'], index = [ 'A', 'B'])이 작동하지 않습니다. 모양이 잘못되었습니다. 그래서 방법?
pashute
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.