Python Panda가 셀에 목록을 삽입합니다.
목록 'abc'와 데이터 프레임 'df'가 있습니다.
abc = ['foo', 'bar']
df =
A B
0 12 NaN
1 23 NaN
목록을 셀 1B에 삽입하고 싶으므로 다음 결과를 원합니다.
A B
0 12 NaN
1 23 ['foo', 'bar']
제가 어떻게 해요?
사용할 경우:
df.ix[1,'B'] = abc
다음 오류 메시지가 표시됩니다.
ValueError: Must have equal len keys and value when setting with an iterable
두 개의 요소가 있는 목록을 행/열에 삽입하려고 하지만 셀에는 삽입하지 않기 때문입니다.
사용할 경우:
df.ix[1,'B'] = [abc]
그런 다음 하나의 요소만 포함된 목록을 삽입합니다('dll' 목록).[['foo', 'bar']]
).
사용할 경우:
df.ix[1,'B'] = ', '.join(abc)
그런 다음 문자열을 삽입합니다.foo, bar
목록이 아닙니다.
사용할 경우:
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
.
부터set_value
버전 0.21.0부터 더 이상 사용되지 않습니다. 이제 를 사용해야 합니다.목록을 올리지 않고 셀에 삽입할 수 있습니다.ValueError
~하듯이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
판다 >= 0.21
set_value
더 이상 사용되지 않습니다.이제 를 사용하여 레이블별로 설정하고 정수 위치별로 설정할 수 있습니다.
/를 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" 열의 두 번째 행에 있는 값을 새 목록으로 설정하려면 다음을 사용합니다.DataFrame.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.
이것은 당신의 목적이 다음과 같기 때문입니다.float64
dtype, 반면 리스트는object
s, 그래서 거기에 불일치가 있습니다.이 경우 먼저 열을 개체로 변환해야 합니다.
>>> 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]
가능하지만 해키
훨씬더이도게하상것어발수견했을있는다네할킹해가▁through▁hack어발▁can▁even했견▁i▁you것을,,▁more▁that▁wacky훨을 해킹할 수 있다는 것을 발견했습니다.DataFrame.loc
중첩된 목록을 통과하면 유사한 결과를 얻을 수 있습니다.
>>> df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
>>> df
A B
0 12 [a, b]
1 23 [m, n, o, p]
이 기능이 작동하는 이유에 대해 자세히 알아볼 수 있습니다.
df3.set_value(1, 'B', abc)
모든 데이터 프레임에 대해 작동합니다.열 'B'의 데이터 유형을 관리합니다.를 들어,할 수 , 이에는 "float", "float", "float"이 .df['B'] = df['B'].astype(object)
도울 수 있습니다.
빠른 해결 방법
아래 데이터 프레임에서 col2에 대해 수행한 것처럼 목록을 새 목록으로 묶기만 하면 됩니다.작동하는 이유는 python이 (목록의) 외부 목록을 가져와 일반 스칼라 항목을 포함하는 것처럼 열로 변환하기 때문입니다. 이는 일반 스칼라가 아닌 우리의 경우 목록입니다.
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]
또한 받기
ValueError: Must have equal len keys and value when setting with an iterable
,
.loc 대신 .at을 사용하는 것이 제 경우에는 아무런 차이가 없었지만, 데이터 프레임 열의 데이터 유형을 적용하는 것이 효과적이었습니다.
df['B'] = df['B'].astype(object)
그런 다음 목록, 누피 배열 및 모든 종류의 것을 데이터 프레임의 단일 셀 값으로 설정할 수 있었습니다.
이 포스트 판다에서 언급한 것처럼, 데이터 프레임에 목록을 저장하는 방법은 무엇입니까?데이터 프레임의 dtype은 결과에 영향을 미칠 수 있으며, 데이터 프레임을 호출하거나 할당하지 않을 수도 있습니다.
구현하기 쉬운 솔루션이 있습니다.
목록 개체를 래핑하고 나중에 클래스에서 값을 호출하기 위해 임시 클래스를 만듭니다.
다음은 실질적인 예입니다.
- 데이터 프레임에 목록 개체를 삽입하려고 합니다.
df = pd.DataFrame([
{'a': 1},
{'a': 2},
{'a': 3},
])
df.loc[:, 'b'] = [
[1,2,4,2,],
[1,2,],
[4,5,6]
] # This works. Because the list has the same length as the rows of the dataframe
df.loc[:, 'c'] = [1,2,4,5,3] # This does not work.
>>> ValueError: Must have equal len keys and value when setting with an iterable
## To force pandas to have list as value in each cell, wrap the list with a temporary class.
class Fake(object):
def __init__(self, li_obj):
self.obj = li_obj
df.loc[:, 'c'] = Fake([1,2,5,3,5,7,]) # This works.
df.c = df.c.apply(lambda x: x.obj) # Now extract the value from the class. This works.
이를 위해 가짜 클래스를 만드는 것은 번거로워 보이지만 몇 가지 실용적인 응용 프로그램이 있을 수 있습니다.을 예를들다같사수있다니습할용이음과와 함께 할 수 .apply
반환 값이 목록인 경우.
일반적으로 판다는 세포에 목록 삽입을 거부하지만 이 방법을 사용하면 삽입을 강제할 수 있습니다.
.at과 .loc을 선호합니다.주의할 점은 대상 열에 다음이 필요하다는 것입니다.dtype
(object
),할 수
import numpy as np
import pandas as pd
df = pd.DataFrame({
'A': [0, 1, 2, 3],
'B': np.array([np.nan]*3 + [[3, 33]], dtype=object),
})
print('df to start with:', df, '\ndtypes:', df.dtypes, sep='\n')
df.at[0, 'B'] = [0, 100] # at assigns single elemnt
df.loc[1, 'B'] = [[ [1, 11] ]] # loc expects 2d input
print('df modified:', df, '\ndtypes:', df.dtypes, sep='\n')
산출량
df to start with:
A B
0 0 NaN
1 1 NaN
2 2 NaN
3 3 [3, 33]
dtypes:
A int64
B object
dtype: object
df modified:
A B
0 0 [0, 100]
1 1 [[1, 11]]
2 2 NaN
3 3 [3, 33]
dtypes:
A int64
B object
dtype: object
먼저 셀을 공백으로 설정합니다.다음으로 abc 목록을 셀에 1, 'B'에 할당하기 위해 사용합니다.
abc = ['foo', 'bar']
df =pd.DataFrame({'A':[12,23],'B':[np.nan,np.nan]})
df.loc[1,'B']=''
df.at[1,'B']=abc
print(df)
언급URL : https://stackoverflow.com/questions/26483254/python-pandas-insert-list-into-a-cell
'programing' 카테고리의 다른 글
Nodemon Error: "파일 감시자 수에 대한 시스템 제한에 도달했습니다. (0) | 2023.05.21 |
---|---|
첫 번째 오류 시 중지 (0) | 2023.05.21 |
Git 하위 모듈을 분리하는 방법은 무엇입니까? (0) | 2023.05.21 |
C# 집합을 설정하시겠습니까? (0) | 2023.05.21 |
'az'라는 용어가 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램의 이름으로 인식되지 않습니다. (0) | 2023.05.21 |