목록에서 데이터 프레임에 열 추가


94

다음과 같은 일부 열이있는 데이터 프레임이 있습니다.

A   B   C  
0   
4
5
6
7
7
6
5

A의 값의 가능한 범위가 0 내지 7 만한다 .

또한 다음과 같은 8 개의 요소 목록이 있습니다.

List=[2,5,6,8,12,16,26,32]  //There are only 8 elements in this list

A 열의 요소가 n 이면 List 의 n 번째 요소를 새 열에 삽입해야합니다 ( 예 : 'D').

전체 데이터 프레임을 반복하지 않고 한 번에 어떻게 할 수 있습니까?

결과 데이터 프레임은 다음과 같습니다.

A   B   C   D
0           2
4           12
5           16
6           26
7           32
7           32
6           26
5           16

참고 : 데이터 프레임은 방대하며 반복은 마지막 옵션입니다. 그러나 필요한 경우 dict와 같은 다른 데이터 구조에서 'List'의 요소를 정렬 할 수도 있습니다.


1
원하는 결과를 가진 (작은) 장난감 예제가 필요하다고 생각합니다. 약간 모호한 ATM 소리입니다.
Andy Hayden

11
절대로 변수 "목록"을 호출하지 마십시오. 모든 언어로.
lucid_dreamer

답변:


50

IIUC, (불행히도 이름이 붙은) List를으로 ndarray만들면 자연스럽게 색인화 할 수 있습니다.

>>> import numpy as np
>>> m = np.arange(16)*10
>>> m[df.A]
array([  0,  40,  50,  60, 150, 150, 140, 130])
>>> df["D"] = m[df.A]
>>> df
    A   B   C    D
0   0 NaN NaN    0
1   4 NaN NaN   40
2   5 NaN NaN   50
3   6 NaN NaN   60
4  15 NaN NaN  150
5  15 NaN NaN  150
6  14 NaN NaN  140
7  13 NaN NaN  130

여기에서 새로운 m을 만들었지 만을 사용 m = np.asarray(List)하면 똑같은 방식으로 작동합니다.의 값은 df.A의 적절한 요소를 선택합니다 m.


당신이 이전 버전을 사용하는 경우주의 numpy, 당신이 사용해야 할 수도 있습니다 m[df.A.values], 과거에 instead-- numpy다른 사람들과 잘 재생되지 않았고, 몇 가지 리팩토링 pandas인한 약간의 두통. 이제 상황이 개선되었습니다.


안녕하세요 @DSM. 나는 당신이 말하는 것을 얻지 만 나는이 오류를 얻고있다 : Traceback (most recent call last): File "./b.py", line 24, in <module> d["D"] = m[d.A] IndexError: unsupported iterator index
mane

1
@mane : urf, 그건 오래된 numpy버그입니다. 당신을 d["D"] = m[d.A.values]위해 일 합니까 ?
DSM

277

목록을 직접 할당하십시오.

df['new_col'] = mylist

대안
목록을 시리즈 또는 배열로 변환 한 다음 할당합니다.

se = pd.Series(mylist)
df['new_col'] = se.values

또는

df['new_col'] = np.array(mylist)

3
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
Ilya Rusin

@sparrow는 dtype을 사용 pd.Series합니까? 수레는 수레로, 문자열은 문자열로 남겨 둘까요? 아니면 목록의 요소가 문자열로 기본 설정됩니까?
3kstc

2
@IlyaRusin,이 경우 무시할 수있는 잘못된 긍정입니다. 추가 정보 : stackoverflow.com/questions/20625582/…
sparrow

1
이는 다음과 같이 단순화 할 수 있습니다. df [ 'new_col'] = pd.Series (mylist) .values
smartse

15

@sparrow의 훌륭한 솔루션을 개선하는 솔루션입니다.

하자 DF , 데이터 세트를, 그리고 myList에 당신이 dataframe에 추가 할 값 목록을.

새 열을 간단히 new_column 이라고 부르고 싶다고 가정 해 보겠습니다.

먼저 목록을 시리즈로 만듭니다.

column_values = pd.Series(mylist)

그런 다음 삽입 기능을 사용하여 열을 추가하십시오. 이 기능은 기둥을 배치 할 위치를 선택할 수있는 장점이 있습니다. 다음 예에서는 왼쪽에서 첫 번째 위치에 새 열을 배치합니다 (loc = 0으로 설정).

df.insert(loc=0, column='new_column', value=column_values)

df의 인덱스를 1,2,3 이외의 다른 것으로 변경하면 작동하지 않습니다.이 경우 줄 사이에 추가해야합니다. column_values.index = df.index
Guy s

8

먼저 보유한 데이터 프레임을 생성하겠습니다. B 열과 C 열은 관련이 없으므로 무시하겠습니다.

df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})

그리고 원하는 매핑 :

mapping = dict(enumerate([2,5,6,8,12,16,26,32]))

df['D'] = df['A'].map(mapping)

끝난!

print df

산출:

   A   D
0  0   2
1  4  12
2  5  16
3  6  26
4  7  32
5  7  32
6  6  26
7  5  16

1
나는 OP가 이미 이것을하는 방법을 알고 있다고 생각합니다. 내가 읽음으로써 문제는 and D의 요소로 구성 됩니다 ( "A 열의 요소가 n 인 경우 목록의 n 번째 요소를 새 열에 삽입해야합니다. 'D'라고 말하십시오.")AList
DSM

그래서 어떤 종류의 F (* & 유모 상태로 변했습니다. 댓글에 대한 @DSM 덕분에 나는 그것이 피어 리뷰 될 때까지 게시물을 수정할 수 없었습니다. 그리고 그것은 너무 빠르기 때문에 거부되었습니다. 내 자신의 편집을 피어 리뷰 할 수 있습니다. 그리고 더 나쁜 (IMHO) 답변이 "수락"되었기 때문에 너무 늦었습니다. 그래서 정말 도움이되지 않는 메타 유모가 있습니다 !!!!
Phil Cooper

글쎄요, 유모들에 대해 말할 수는 없지만, 당신은 당신의 접근 방식이 긴 배열에서 훨씬 느리다는 것을 알게 될 것입니다. 다른 측면에서, 물론, 사이의 선택 np.array(List)[df.A]df["A"].map(dict(enumerate(List)))대부분 취향의 문제이다.
DSM

안녕 Phil, 나는 귀하의 솔루션과 DSM의 의견 만 보았고 DSM의 솔루션이 저에게 잘 작동했기 때문에 다시는받지 못했습니다. 그러나 이제 솔루션을 살펴보면 작동합니다. 약 200k 항목의 데이터 세트에서 DSM의 솔루션을 실행했으며 내가 가진 다른 모든 계산으로 몇 초 만에 실행됩니다. 나는 python-pandas를 처음 접했고 개인적으로 우아하거나 멋진 것을 찾지 않았습니다. 어떤 것이 든 괜찮 았습니다. 그러나 솔직히 해결책에 감사드립니다.
갈기

2

오래된 질문; 하지만 저는 항상 가장 빠른 코드를 사용하려고합니다!

나는 6,900 만 개의 uint64가있는 거대한 목록을 가지고 있었다. np.array () 가 가장 빠릅니다.

df['hashes'] = hashes
Time spent: 17.034842014312744

df['hashes'] = pd.Series(hashes).values
Time spent: 17.141014337539673

df['key'] = np.array(hashes)
Time spent: 10.724546194076538
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.