programing

시리즈 및 데이터 프레임 병합 방법

cafebook 2023. 8. 6. 10:20
반응형

시리즈 및 데이터 프레임 병합 방법

와 인덱스에서 병합하는 방법에 대한 정보를 찾으시려면 이 답변을 참조하시기 바랍니다.

OP의 원래 의도는 열 요소를 다른 DataFrame에 열로 할당하는 방법을 묻는 것이었습니다.이에 대한 답을 알고 싶다면 EdChum이 수락한 답을 보십시오.


내가 생각해낼 수 있는 최선은

df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]})  # see EDIT below
s = pd.Series({'s1':5, 's2':6})

for name in s.index:
    df[name] = s[name]

   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

더 나은 구문/더 빠른 방법을 제안할 수 있는 사람이 있습니까?

내 시도:

df.merge(s)
AttributeError: 'Series' object has no attribute 'columns'

그리고.

df.join(s)
ValueError: Other Series must have a name

편집 게시된 처음 두 개의 답변은 제 질문에 대한 문제를 강조했으므로 다음을 사용하여 구성하십시오.df:

df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])

최종 결과로

    a  b  s1  s2
3 NaN  4   5   6
5   2  5   5   6
6   3  6   5   6


v0.24.0부터 시리즈 이름이 지정된 경우 DataFrame 및 Series에서 병합할 수 있습니다.

df.merge(s.rename('new'), left_index=True, right_index=True)
# If series is already named,
# df.merge(s, left_index=True, right_index=True)

이제는 단순히 시리즈를 to_frame()이 있는 데이터 프레임으로 변환할 수 있습니다.따라서(인덱스에 가입한 경우):

df.merge(s.to_frame(), left_index=True, right_index=True)

시리즈에서 데이터 프레임을 구성한 다음 데이터 프레임과 병합할 수 있습니다.하고, 데 이 터 를 값 으 지 다 설 모 니 다 합 정 대 를 수 다 한 에 음 고 하 설 정 로 인 열 스 덱 곱 음 한 길 로 이left_index그리고.right_index:예:

In [27]:

df.merge(pd.DataFrame(data = [s.values] * len(s), columns = s.index), left_index=True, right_index=True)
Out[27]:
   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

영상 시리즈에서 생성된 df의 인덱스가 df의 인덱스를 사용하도록 하려면 EDIT를 사용하여 다음을 수행할 수 있습니다.

df.merge(pd.DataFrame(data = [s.values] * len(df), columns = s.index, index=df.index), left_index=True, right_index=True)

이것은 지수가 길이와 일치한다고 가정합니다.

한 가지 방법이 있습니다.

df.join(pd.DataFrame(s).T).fillna(method='ffill')

여기서 일어나는 일들을 분석하는 것은...

pd.DataFrame(s).T에 행데프생성에서 1행 합니다.s이는 다음과 같습니다.

   s1  s2
0   5   6

다음 분.join는 이 새을 이새프연결니다합을임으로 합니다.df:

   a  b  s1  s2
0  1  3   5   6
1  2  4 NaN NaN

지막으로마로.NaN은 인스 1의 다을사 여하열의채이다값워니집을 사용하여 .fillna 필forward-fill)과.ffill 인수:

   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

면려하용 사용을 fillna사할수 있다니습용다를 사용하는합니다.pd.concat 프레임의 을 반복합니다.s인 해결책은 다음과 같습니다

df.join(pd.concat([pd.DataFrame(s).T] * len(df), ignore_index=True))

다음은 편집된 질문에서 제기된 인덱싱 문제를 해결하기 위한 다른 솔루션입니다.

df.join(pd.DataFrame(s.repeat(len(df)).values.reshape((len(df), -1), order='F'), 
        columns=s.index, 
        index=df.index))

s값을 반복하고 모양을 변경('Fortran' 순서 지정)하고 적절한 열 이름과 인덱스를 전달하여 데이터 프레임으로 변환됩니다.그런 다음 이 새 데이터 프레임이 다음에 연결됩니다.df.

오늘날에는 훨씬 간단하고 간결한 솔루션으로 동일한 작업을 수행할 수 있습니다.시리즈를 해당 DataFrame의 열로 전환하는 기능을 활용하면 다음을 사용할 수 있습니다.

df.join(df.apply(lambda x: s, axis=1))

결과:

     a  b  s1  s2
3  NaN  4   5   6
5  2.0  5   5   6
6  3.0  6   5   6

여기서, 우리는 간단한 람다 함수를 적용된 함수로 사용했습니다.axis=1적용된 람다 함수는 시리즈를 반환하기만 하면 됩니다.

df.apply(lambda x: s, axis=1)

결과:

   s1  s2
3   5   6
5   5   6
6   5   6

는 이미 DataFrame의 행 했습니다.df결과적으로, 우리는 간단히 합류할 수 있습니다.df이 중간 결과를 사용하여 원하는 최종 결과를 얻을 수 있습니다(행 인덱스가 같기 때문에).

시리즈를 해당 DataFrame의 열로 전환하는 기능은 다음과 같이 공식 문서에 잘 설명되어 있습니다.

기본적으로 최종 반환 유형은 적용된 함수의 반환 유형에서 유추됩니다(result_type=Discovery).


기본 동작(result_type=Discovery)은 적용된 함수의 반환 값에 따라 달라집니다. 목록과 같은 결과는 일련의 결과로 반환됩니다.그러나 적용 함수가 영상 시리즈를 반환하는 경우 영상 시리즈는 열확장됩니다.

공식 문서에는 다음과 같은 사용 예도 포함되어 있습니다.

함수 내부에서 Series를 반환하는 것은 result_type='type'을 전달하는 것과 유사합니다.결과 열 이름은 시리즈 인덱스가 됩니다.

df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)   

   foo  bar
0    1    2
1    1    2
2    1    2

데이터 프레임을 이렇게 설정하는 것이 좋습니다(자동 인덱싱).

df = pd.DataFrame({'a':[np.nan, 1, 2], 'b':[4, 5, 6]})

그런 다음 s1 및 s2 값을 다음과 같이 설정할 수 있습니다(shape()을 사용하여 df에서 행 수를 반환합니다).

s = pd.DataFrame({'s1':[5]*df.shape[0], 's2':[6]*df.shape[0]})

원하는 결과는 간단합니다.

display (df.merge(s, left_index=True, right_index=True))

또는 데이터 프레임에 새 값을 추가합니다. df:

df = pd.DataFrame({'a':[nan, 1, 2], 'b':[4, 5, 6]})
df['s1']=5
df['s2']=6
display(df)

두 반환 모두:

     a  b  s1  s2
0  NaN  4   5   6
1  1.0  5   5   6
2  2.0  6   5   6

(적용할 단일 값 대신) 다른 데이터 목록이 있고 df와 동일한 순서에 있다는 것을 알고 있는 경우, 예:

s1=['a','b','c']

그러면 다음과 같은 방식으로 첨부할 수 있습니다.

df['s1']=s1

반환:

     a  b s1
0  NaN  4  a
1  1.0  5  b
2  2.0  6  c

여러분은 쉽게 판다를 기를 수 있습니다.데이터 프레임 열을 상수로 지정합니다.이 상수는 예제에서와 같이 int가 될 수 있습니다.지정한 열이 df에 없으면 지정한 이름으로 새 열을 만듭니다.따라서 데이터 프레임이 구성된 후에는 다음과 같은 작업을 수행할 수 있습니다(질문을 참조).

df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])

그냥 실행할 수 있습니다.

df['s1'], df['s2'] = 5, 6

실제 데이터를 저장하는 방법에 따라 튜플 목록의 모든 요소 또는 사전의 키와 값에 대해 루프 또는 이해를 작성할 수 있습니다.

한다면df이다.pandas.DataFrame그리고나서df['new_col']= Series list_object of length len(df)또는 Series list_object를 이름이 지정된 열로 추가합니다.'new_col'.df['new_col']= scalar(예: 당신의 경우 5 또는 6)도 작동하고 다음과 같습니다.df['new_col']= [scalar]*len(df)

따라서 두 줄로 된 코드는 다음과 같은 목적을 달성합니다.

df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]})
s = pd.Series({'s1':5, 's2':6})
for x in s.index:    
    df[x] = s[x]

Output: 
   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

언급URL : https://stackoverflow.com/questions/26265819/how-to-merge-a-series-and-dataframe

반응형