Pandas 데이터 프레임에 상수 값이있는 열 추가 [중복]


102

DataFrame이 주어지면 :

np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df

          A         B         C
1  1.764052  0.400157  0.978738
2  2.240893  1.867558 -0.977278
3  0.950088 -0.151357 -0.103219

상수 값 (예 : 0)을 포함하는 새 열을 추가하는 가장 간단한 방법은 무엇입니까?

          A         B         C  new
1  1.764052  0.400157  0.978738    0
2  2.240893  1.867558 -0.977278    0
3  0.950088 -0.151357 -0.103219    0

이것이 내 솔루션이지만 NaN을 '새'열에 넣는 이유를 모르겠습니다.

df['new'] = pd.Series([0 for x in range(len(df.index))])

          A         B         C  new
1  1.764052  0.400157  0.978738  0.0
2  2.240893  1.867558 -0.977278  0.0
3  0.950088 -0.151357 -0.103219  NaN

9
색인을 사용하면 괜찮습니다. df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index).
zach

5
또한 여기에서는 목록 이해가 전혀 필요하지 않습니다. 단지 할[0] * len(df.index)
acushner

@joris, df [ 'new'] = 0은 전체 열에 0을 할당하는 적절한 이유를 보여 주지만 첫 번째 시도에서 NaN을 삽입하는 이유는 설명하지 않습니다. 이것은 내가 수락 한 답변에서 Philip Cloud에 의해 답변되었습니다.
yemu

7
간단히하십시오df['new'] = 0
flow2k

답변:


21

이 풋 이유 NaN때문에 열에는 df.indexIndex당신의 오른쪽 측 객체의이 다릅니다. @zach는 0의 새 열을 할당하는 적절한 방법을 보여줍니다. 일반적 pandas으로 가능한 한 많은 인덱스 정렬을 시도합니다. 한 가지 단점은 인덱스가 일치하지 않을 때 당신이 얻을 것입니다 NaN그들이 어디에 되지 않습니다 정렬됩니다. 함께 놀러 reindexalign부분적으로이 객체와 정렬 작업을위한 약간의 직관을 얻을 방법, 완전히, 그리고 정렬되지-모든 정렬 인덱스를. 예를 들어 DataFrame.align()부분적으로 정렬 된 인덱스를 사용 하는 방법 은 다음과 같습니다.

In [7]: from pandas import DataFrame

In [8]: from numpy.random import randint

In [9]: df = DataFrame({'a': randint(3, size=10)})

In [10]:

In [10]: df
Out[10]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [11]: s = df.a[:5]

In [12]: dfa, sa = df.align(s, axis=0)

In [13]: dfa
Out[13]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [14]: sa
Out[14]:
0     0
1     2
2     0
3     1
4     0
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
Name: a, dtype: float64

9
내가 downvote didnt는하지만 코드는 개봉 스 니펫에 달성하기 위해 노력과 함께 따라 열심히하게, 의견을 결여
시정

8
이것은 실제로 질문에 대한 답이 아닙니다. OP는 상수 값을 포함하는 새 열을 추가하는 방법에 대해 묻습니다.
cs95

여기에 단 하나의 질문 이 있다는 데 동의하지 않습니다 . "열에 상수 값을 어떻게 할당합니까?"가 있습니다. 뿐만 아니라 "내 시도가 X 방식으로 작동하지 않습니다. 왜 예기치 않게 작동합니까?" 나는 두 가지 요점을 모두 언급했다고 생각합니다. 첫 번째는 다른 답변을 참조하여. 내 대답의 모든 텍스트를 읽으십시오 .
Phillip Cloud

나는 당신의 대답보다는 질문에 문제가 있다고 생각합니다. 이 게시물에는 두 가지 다른 질문이 포함되어 있으므로 질문에 답변하려면 두 가지 다른 답변이 필요합니다. 나는 이것이 너무 광범위하다고 표시되어야한다고 생각하며 포스터는 두 가지 별도의 질문을해야했습니다.
Kevin

82

매우 간단한 내부 할당 : df['new'] = 0

내부 수정의 경우 직접 할당을 수행하십시오. 이 할당은 각 행에 대해 pandas에 의해 브로드 캐스팅됩니다.

df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x

df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

개체 열에 대한 참고 사항

빈 목록 열을 추가하려면 다음과 같이 조언합니다.

  • 이것을하지 않는 것을 고려하십시오. object칼럼은 성능 측면에서 나쁜 소식입니다. 데이터의 구조를 재고하십시오.
  • 희소 데이터 구조에 데이터를 저장하는 것이 좋습니다. 추가 정보 : 희소 데이터 구조
  • 목록 열을 저장해야하는 경우 동일한 참조를 여러 번 복사하지 않도록하십시오.

    # Wrong
    df['new'] = [[]] * len(df)
    # Right
    df['new'] = [[] for _ in range(len(df))]
    

사본 생성 : df.assign(new=0)

대신 사본이 필요하면 다음을 사용하십시오 DataFrame.assign.

df.assign(new='y')

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

그리고 같은 값으로 여러 열을 할당해야하는 경우 다음과 같이 간단합니다.

c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))

   A  B  C new1 new2
0  x  x  x    y    y
1  x  x  x    y    y
2  x  x  x    y    y
3  x  x  x    y    y

다중 열 할당

마지막으로 값이 서로 다른 여러 열을 할당해야하는 경우 assign사전과 함께 사용할 수 있습니다 .

c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)

   A  B  C new1 new2 new3
0  x  x  x    w    y    z
1  x  x  x    w    y    z
2  x  x  x    w    y    z
3  x  x  x    w    y    z

17

최신 판다를 사용하면 다음을 수행 할 수 있습니다.

df['new'] = 0

1
어떤 특정 답변이 최신이 아닌지 지적 할 수 있습니까? 작성자가 개선의 기회를 가질 수 있도록 그 아래에 댓글을 남겨 둡시다.
cs95

1
이 답변과 cs95 (일명, 나) 답변의 유일한 차이점은 열 이름과 값입니다. 모든 조각이 있습니다.
cs95

1
구식이 아닌 것은 아니지만이 답변은 다른 답변보다 덜 장황하고 읽기 쉽습니다.
Joey

1
@Joey 그 논리에 대해 논쟁 할 수는 없습니다.이 답변은 라이브러리에 대해 더 많이 이해하고 배우는 것보다 작동하는 것을 복사하여 붙여 넣으려는 사람들에게 더 적합하다고 생각합니다. 터치.
cs95

1
@ cs95 yes 귀하의 답변은 사람들이 더 많은 것을 배울 수 있도록합니다. 또한 제목에서 강조 표시된 df [ 'new'] = 0은 가독성에 좋습니다. 나는 그것도 찬성했습니다. df.apply (lambda x : 0, axis = 1)보다 덜 장황함
Joey

7

다음은 람다를 사용하는 또 다른 라이너 입니다 (상수 값 = 10 인 열 만들기).

df['newCol'] = df.apply(lambda x: 10, axis=1)

전에

df
    A           B           C
1   1.764052    0.400157    0.978738
2   2.240893    1.867558    -0.977278
3   0.950088    -0.151357   -0.103219

df
        A           B           C           newCol
    1   1.764052    0.400157    0.978738    10
    2   2.240893    1.867558    -0.977278   10
    3   0.950088    -0.151357   -0.103219   10

5
df['newCol'] = 10또한 하나의 라이너입니다 (더 빠릅니다). 여기서 적용을 사용하면 어떤 이점이 있습니까?
cs95

2
여기서 당신과 경쟁하려는 것이 아니라 단지 대안적인 접근 방식을 보여주는 것입니다.
그랜트 섀넌

@ cs95 이것은 도움이됩니다. 각 값이 별도의 빈 목록 인 새 열을 만들고 싶었습니다. 이 방법 만 작동합니다.
Yatharth Agarwal

@YatharthAgarwal 나는 당신에게 그것을 줄 것이지만 pandas가 목록 열과 잘 작동하도록 설계되지 않았기 때문에 의미가 있습니다.
cs95

1
@YatharthAgarwal 빈 목록을 할당해야하는 경우 apply를 사용하기 때문에 여전히 하위 솔루션입니다. 시도df['new'] = [[] for _ in range(len(df))]
cs95
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.