Python Pandas는 셀에 목록을 삽입합니다.


106

목록 'abc'와 데이터 프레임 'df'가 있습니다.

abc = ['foo', 'bar']
df =
    A  B
0  12  NaN
1  23  NaN

목록을 셀 1B에 삽입하고 싶으므로이 결과를 원합니다.

    A  B
0  12  NaN
1  23  ['foo', 'bar']

할 수 있을까요?

1) 이것을 사용하는 경우 :

df.ix[1,'B'] = abc

다음과 같은 오류 메시지가 나타납니다.

ValueError: Must have equal len keys and value when setting with an iterable

두 개의 요소가있는 목록을 셀이 아닌 행 / 열에 삽입하려고하기 때문입니다.

2) 이것을 사용하는 경우 :

df.ix[1,'B'] = [abc]

그런 다음 'abc'목록 ( [['foo', 'bar']]) 인 요소가 하나만있는 목록을 삽입합니다 .

3) 이것을 사용하는 경우 :

df.ix[1,'B'] = ', '.join(abc)

그런 다음 foo, bar목록이 아닌 문자열 (( )을 삽입 합니다.

4) 이것을 사용하는 경우 :

df.ix[1,'B'] = [', '.join(abc)]

그런 다음 목록을 삽입하지만 하나의 요소 ( ['foo, bar']) 만 있고 내가 원하는대로 두 개는 없습니다 ( ['foo', 'bar']).

도와 줘서 고마워!


편집하다

내 새 데이터 프레임 및 이전 목록 :

abc = ['foo', 'bar']
df2 =
    A    B         C
0  12  NaN      'bla'
1  23  NaN  'bla bla'

다른 데이터 프레임 :

df3 =
    A    B         C                    D
0  12  NaN      'bla'  ['item1', 'item2']
1  23  NaN  'bla bla'        [11, 12, 13]

'abc'목록을 df2.loc[1,'B']및 / 또는에 삽입하고 싶습니다 df3.loc[1,'B'].

데이터 프레임에 정수 값 및 / 또는 NaN 값 및 / 또는 목록 값만있는 열이있는 경우 목록을 셀에 삽입하면 완벽하게 작동합니다. 데이터 프레임에 문자열 값 및 / 또는 NaN 값 및 / 또는 목록 값만있는 열이있는 경우 목록을 셀에 삽입하면 완벽하게 작동합니다. 그러나 데이터 프레임에 정수 및 문자열 값이있는 열과 다른 열이있는 경우 다음을 사용하면 오류 메시지가 나타납니다. df2.loc[1,'B'] = abc또는 df3.loc[1,'B'] = abc.

다른 데이터 프레임 :

df4 =
          A     B
0      'bla'  NaN
1  'bla bla'  NaN

이 삽입물은 완벽하게 작동합니다 : df.loc[1,'B'] = abc또는 df4.loc[1,'B'] = abc.


1
사용중인 판다 버전은 무엇입니까? 다음은 pandas를 사용하여 작업했습니다 0.15.0.df.loc[1,'b'] = ['foo','bar']
EdChum

감사합니다! 저는 Python 2.7을 사용하고 pandas 0.14.0 및 0.15.0을 시도했으며 위의 테스트 데이터로 작동했습니다. 그러나 정수 값과 함께 'C'열이 있으면 어떻게 될까요? 'A'에는 문자열이 있습니다. 정수 열과 srting 열이 있으면 같은 오류가 발생합니다. ValueError : 반복 가능한 설정시 동일한 len 키와 값이 있어야합니다
ragesz

당신은 설명하고 당신이 무슨 뜻인지 보여 데이터와 코드를 게시해야 할거야
EdChum

답변:


121

이후 set_value되었습니다 되지 않는 버전 0.21.0 때문에, 당신은 지금 사용해야합니다 at. ValueErroras 를 올리지 않고 목록을 셀에 삽입 할 수 있습니다 loc. at 항상 단일 값 loc을 참조하고 행과 열뿐만 아니라 값을 참조 할 수 있기 때문이라고 생각합니다 .

df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})

df.at[1, 'B'] = ['m', 'n']

df =
    A   B
0   1   x
1   2   [m, n]
2   3   z

당신은 또한 확실히 할 필요가 당신이 가지고에 삽입됩니다 dtype=object. 예를 들면

>>> df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [1,2,3]})
>>> df.dtypes
A    int64
B    int64
dtype: object

>>> df.at[1, 'B'] = [1, 2, 3]
ValueError: setting an array element with a sequence

>>> df['B'] = df['B'].astype('object')
>>> df.at[1, 'B'] = [1, 2, 3]
>>> df
   A          B
0  1          1
1  2  [1, 2, 3]
2  3          3

4
나는이 작업을 수행하려면 반드시 원래 dataframe의 DTYPE이 객체로 설정했습니다 :df = pd.DataFrame(data, dtype=object)
Takver

2
에 인덱스가 필요합니다. 다른 속성 값 일치를 사용하여 행을 어떻게 참조합니까? 예 : 위의 예에서 A = 2 인 행의 경우?
bikashg

8
이것은 또 다른 오류를 반환합니다 ValueError: setting an array element with a sequence.. 오류가 발생하면 @ cs95의 답변을 참조하십시오.
Blaszard

39

df3.set_value(1, 'B', abc)모든 데이터 프레임에서 작동합니다. 'B'열의 데이터 유형을 관리하십시오. 예 : 목록을 부동 열에 삽입 할 수 없습니다 df['B'] = df['B'].astype(object). 이 경우 도움이 될 수 있습니다.


6
이 명령은 더 이상 사용되지 않습니다 . 바로 아래에 업데이트가 있습니다.
Thomas

35

판다> = 0.21

set_value더 이상 사용되지 않습니다. 이제 DataFrame.at레이블 DataFrame.iat로 설정하고 정수 위치로 설정하는 데 사용할 수 있습니다 .

at/로 셀 값 설정iat

# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df

    A       B
0  12  [a, b]
1  23  [c, d]

df.dtypes

A     int64
B    object
dtype: object

"B"의 두 번째 행에있는 값을 새 목록에 설정하려면 DataFrane.at다음을 사용하십시오 .

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

다음을 사용하여 정수 위치로 설정할 수도 있습니다. DataFrame.iat

df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

내가 얻는다면 ValueError: setting an array element with a sequence?

나는 이것을 다음과 같이 재현하려고 노력할 것입니다.

df

    A   B
0  12 NaN
1  23 NaN

df.dtypes

A      int64
B    float64
dtype: object

df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.

이는 객체가 float64dtype이고 목록이 objects이기 때문에 불일치가 있기 때문입니다. 이 상황에서해야 할 일은 먼저 열을 개체로 변환하는 것입니다.

df['B'] = df['B'].astype(object)
df.dtypes

A     int64
B    object
dtype: object

그런 다음 작동합니다.

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12     NaN
1  23  [m, n]

가능하지만 Hacky

더 이상하게도, DataFrame.loc중첩 된 목록을 통과하면 비슷한 결과 를 얻기 위해 해킹 할 수 있다는 것을 알았습니다 .

df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df

    A             B
0  12        [a, b]
1  23  [m, n, o, p]

이것이 작동하는 이유에 대한 자세한 내용은 여기에서 확인할 수 있습니다 .



2

빠른 해결

아래 데이터 프레임에서 col2에 대해 수행 한 것처럼 목록을 새 목록으로 묶기 만하면됩니다. 작동하는 이유는 파이썬이 외부 목록 (목록)을 가져 와서 일반 스칼라 항목이 포함 된 것처럼 열로 변환하기 때문입니다.이 경우에는 일반 스칼라가 아닌 목록입니다.

mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data


   col1     col2
0   1       [1, 4]
1   2       [2, 5]
2   3       [3, 6]

0

또한 점점

ValueError: Must have equal len keys and value when setting with an iterable,

.loc 대신 .at를 사용하면 내 경우에는 아무런 차이가 없지만 데이터 프레임 열의 데이터 유형을 적용하면 트릭이 발생했습니다.

df['B'] = df['B'].astype(object)

그런 다음 목록, numpy 배열 및 모든 종류의 항목을 데이터 프레임의 단일 셀 값으로 설정할 수 있습니다.

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