programing

Python Panda가 셀에 목록을 삽입합니다.

i4 2023. 5. 21. 10:57
반응형

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.

이것은 당신의 목적이 다음과 같기 때문입니다.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]

가능하지만 해키

훨씬더이도게하상것어발수견했을있는다네할킹해가▁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은 결과에 영향을 미칠 수 있으며, 데이터 프레임을 호출하거나 할당하지 않을 수도 있습니다.

구현하기 쉬운 솔루션이 있습니다.

목록 개체를 래핑하고 나중에 클래스에서 값을 호출하기 위해 임시 클래스를 만듭니다.

다음은 실질적인 예입니다.

  1. 데이터 프레임에 목록 개체를 삽입하려고 합니다.
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

반응형